如何通过C#代码恢复SQL Server数据库

Gol*_*old 15 c# sql-server-2008

我尝试像这样恢复数据库:

SQL = @"RESTORE DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'";
                Cmd = new SqlCommand(SQL, Conn);
                Cmd.ExecuteNonQuery();
                Cmd.Dispose();
Run Code Online (Sandbox Code Playgroud)

但我总是得到错误:

消息3102,级别16,状态1,行7
RESTORE无法处理数据库'MyDataBase',因为此会话正在使用它.建议在执行此操作时使用master数据库.
Msg 3013,Level 16,State 1,Line 7
RESTORE DATABASE正在异常终止.

gbn*_*gbn 14

您的数据库连接最有可能是您尝试还原的数据库.所以有一个DB共享锁可以阻止数据库的恢复

试试这个

SQL = @"USE master BACKUP DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'";
Run Code Online (Sandbox Code Playgroud)

或者更改连接详细信息以使用主数据库


C-P*_*uru 14

我更喜欢使用SMO来恢复备份:

Microsoft.SqlServer.Management.Smo.Server smoServer = 
     new Server(new ServerConnection(server));

Database db = smoServer.Databases['MyDataBase'];
string dbPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase.mdf');
string logPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase_Log.ldf');
Restore restore = new Restore();
BackupDeviceItem deviceItem = 
    new BackupDeviceItem('d:\MyDATA.BAK', DeviceType.File);
restore.Devices.Add(deviceItem);
restore.Database = backupDatabaseTo;
restore.FileNumber = restoreFileNumber;
restore.Action = RestoreActionType.Database;
restore.ReplaceDatabase = true;
restore.SqlRestore(smoServer);

db = smoServer.Databases['MyDataBase'];
db.SetOnline();
smoServer.Refresh();
db.Refresh();
Run Code Online (Sandbox Code Playgroud)

您将需要对Microsoft.SqlServer.Smo,Microsoft.SqlServer.SmoExtended和Microsoft.SqlServer.Management.Sdk.Sfc的引用.

  • 在我的机器上,访问这些库所需的DLL位于C:\ Program Files(x86)\ Microsoft SQL Server\110\SDK\Assemblies中(因为我已将SQL Server Management Studio作为SQL Server Express 2008 R2的一部分安装),并且我需要浏览到此文件夹并添加:Microsoft.SqlServer.ConnectionInfo.dll,Microsoft.SqlServer.Management.Sdk.Sfc.dll,Microsoft.SqlServer.Smo.dll,Microsoft.SqlServer.SmoExtended.dll. (2认同)

小智 6

  public void Restore(string Filepath)
        {
            try
            {
                if(con.State == ConnectionState.Closed)
                {
                    con.Open();
                }
                SqlCommand cmd1 = new SqlCommand("ALTER DATABASE [" + Database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE ", con);
                cmd1.ExecuteNonQuery();
                SqlCommand cmd2 = new SqlCommand("USE MASTER RESTORE DATABASE [" + Database + "] FROM DISK='" + Filepath + "' WITH REPLACE", con);
                cmd2.ExecuteNonQuery();
                SqlCommand cmd3 = new SqlCommand("ALTER DATABASE [" + Database + "] SET MULTI_USER", con);
                cmd3.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            con.Close();
        }
Run Code Online (Sandbox Code Playgroud)


Mit*_*ers 1

您必须通过不同的数据库连接到数据库服务器。

因此,您的连接字符串应该让您输入“Master”或服务器上的另一个数据库,然后您就可以完成手头的任务。