C#代码备份选项出错

时间:2013-05-12 07:28:58

标签: c# sql-server

我写了这段代码 但它的生成错误

请帮助

System.IO.File.Copy("JDB.mdf", "d:\\JDB.mdf", true);
System.IO.File.Copy("JDb_log.ldf", "d:\\JDb_log.ldf", true);

错误是

  

该进程无法访问文件'JDB.mdf',因为它正由另一个进程使用。

请帮帮我

2 个答案:

答案 0 :(得分:3)

  1. 某个进程正在使用该文件。我相信数据库仍然附加到Sql Server。
  2. 使用Sys Internal的Process Explorer工具查找使用此文件的程序。
  3. 为什么不使用SQL后备工具来备份数据库?
  4. 查看What happens during a live SQL Server backup?

    如果您仍想备份或复制ldf mdf文件,则可以执行以下步骤: 1.分离数据库

    USE MASTER;
    GO
    -- Take database in single user mode -- if you are facing errors
    -- This may terminate your active transactions for database
    ALTER DATABASE DatabaseName
    SET SINGLE_USER
    WITH ROLLBACK IMMEDIATE;
    GO
    -- Detach DB
    EXEC MASTER.dbo.sp_detach_db @dbname = N'DatabaseName'
    
    1. 打开Windows资源管理器,转到ldf和mdf文件所在的文件夹,然后手动复制该文件。

    2. 重新连接数据库:

    3. USE [master]
          GO
          CREATE DATABASE [DatabaseName] ON
          ( FILENAME = N’C:\Data\DataBase_Data.mdf’ ),
          ( FILENAME = N’C:\Data\Database_Log.ldf’ )
          FOR ATTACH
          GO
          IF EXISTS ( SELECT name FROM master.sys.databases sd  
          WHERE name = N’DataBaseName’ AND SUSER_SNAME(sd.owner_sid) = SUSER_SNAME() )
              EXEC [AdventureWorks].dbo.sp_changedbowner @loginame=N’sa’,@map=false
      
      1. 如果您想以编程方式执行此操作,则可以使用ADO.NET执行步骤1,2,3中给出的命令,并使用c#file copy命令复制该文件。

答案 1 :(得分:1)

下载Process Explorer并运行该程序。

选项1:

单击“查找”菜单,然后选择“查找句柄”或“DLL ...”

输入文件名(在您的情况下为JDB.mdf)

输入搜索词组后,单击“搜索”按钮

一旦你知道文件锁定了你的进程,就需要关闭该进程(通过关闭该程序)。另一个选择是在进程资源管理器中使用KILL来终止该进程。

选项2:

从错误消息中,.mdf文件已附加到SQL Server的实例。如果您有多个实例正在运行,请确保它与任何其他实例分离。