【问题标题】:Database restore error in C# [duplicate]C#中的数据库还原错误[重复]
【发布时间】:2012-12-20 01:04:05
【问题描述】:

可能重复:
Exclusive access could not be obtained because the database is in use

我在项目中使用 C#、.net4 和 SQL Server 2008 R2 并使用此代码恢复数据库:

_comm = new SqlCommand("use master; RESTORE DATABASE [DB1] FROM  DISK = @Address WITH  RESTRICTED_USER,  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10; use DB1;", _conn);
        _comm.CommandType = System.Data.CommandType.Text;
        _comm.Parameters.AddRange(new SqlParameter[] 
                {
                new SqlParameter("@Address", _path)
                });

            _conn.Open();
            _comm.ExecuteNonQuery();

显示如下错误:

无法获得独占访问权限,因为数据库正在使用中。 RESTORE DATABASE 异常终止。 将数据库上下文更改为“主”。 将数据库上下文更改为“DB1”。

【问题讨论】:

  • 消息很清楚:DB1 数据库仍在被其他人使用 - 您在 SQL Server Management Studio 中打开了查询窗口,或者其他一些应用程序仍连接到该数据库。您不能在使用数据库时恢复它。
  • 另外:您不应该在 C# 中的 SQL 语句中使用 use master - 如果您想在 master 数据库上执行某些操作 - 您需要有一个适当的连接字符串:server=YourServer;database=master; ......
  • 我删除'使用主人;'但是还是有错误

标签: c# sql-server-2008-r2


【解决方案1】:

连接到服务器后,最好使用 SMO(因为不需要 master),您可以随心所欲

using Microsoft.SqlServer.Management.Smo;

...

        Server myServer = new Server(@".\SQLExpress");

        Database mydb = myServer.Databases["DB1"];
        if(mydb!=null)
           myServer.KillAllProcesses(mydb.Name);//detach

        Restore restoreDB = new Restore();
        restoreDB.Database = mydb.Name;

        restoreDB.Action = RestoreActionType.Database;
        restoreDB.Devices.AddDevice(_path, DeviceType.File);


        restoreDB.ReplaceDatabase = true;

        restoreDB.NoRecovery = false;

        restoreDB.SqlRestore(myServer);

备份

        Server myServer = new Server(@".\SQLExpress");

        Database mydb = myServer.Databases["DB1"];

        Backup bkp = new Backup();

        bkp.Action = BackupActionType.Database;

        bkp.Database = mydb.Name;

        bkp.Devices.AddDevice(_path, DeviceType.File);

        bkp.BackupSetName = "DB1 backup";//optional
        bkp.BackupSetDescription = "mybackup dated " + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");//optional

        bkp.Initialize = true;
        bkp.Incremental = false;

        bkp.SqlBackup(myServer);

参考资料:

C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll

C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Management.Sdk.Sfc.dll

C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Smo.dll

C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.SmoExtended.dll

【讨论】:

  • 我不能使用服务器&数据库&恢复类。请给我上课参考
  • 相信我,使用 SMO 会对您有很大帮助(就像使用 SqlServer Management Studio 但在 C# 中一样),您可以备份、恢复、将数据库从服务器转移到另一个服务器,以强大的方式获取所有信息类型化的类
  • 请给我 SMO 代码以便备份。谢谢 :-)
  • 更新了我的代码@AhmadKazemi
  • @S3ddi9 你能给我完整的代码吗?我可以在其中放置数据库名称、路径,或者你能评论你的代码吗?谢谢
【解决方案2】:

在调用SqlCommand之前插入下面一行:

_conn.ChangeDatabase("master");

【讨论】:

    猜你喜欢
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多