如何通过C#代码恢复SQL Server数据库
我尝试按如下方式恢复数据库:如何通过C#代码恢复SQL Server数据库,c#,sql-server-2008,C#,Sql Server 2008,我尝试按如下方式恢复数据库: SQL = @"RESTORE DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'"; Cmd = new SqlCommand(SQL, Conn); Cmd.ExecuteNonQuery(); Cmd.Dispose(); 但我总是犯错误: Msg 3102,第16级,状态1,第7行 还原无法处理数据库“MyDataBase”,
SQL = @"RESTORE DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'";
Cmd = new SqlCommand(SQL, Conn);
Cmd.ExecuteNonQuery();
Cmd.Dispose();
但我总是犯错误:
Msg 3102,第16级,状态1,第7行还原无法处理数据库“MyDataBase”,因为它正在使用中 到本届会议为止。建议使用主数据库 执行此操作时。
味精3013,第16级,状态1,第7行
还原数据库正在异常终止
必须通过其他数据库连接到数据库服务器
因此,您的连接字符串应该让您说出“Master”或服务器上的另一个数据库,然后您就可以完成手头的任务。您的连接字符串应该有一个
Master
数据库作为默认目录进行连接 您的数据库连接最有可能连接到您试图恢复的数据库。因此,有一个DB共享锁,它阻止恢复您的DB
试试这个
SQL = @"USE master BACKUP DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'";
或者将连接详细信息更改为使用master DB我更喜欢使用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();
您需要对Microsoft.SqlServer.Smo、Microsoft.SqlServer.SmoExtended和Microsoft.SqlServer.Management.Sdk.Sfc的引用
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();
}
{
尝试
{
if(con.State==ConnectionState.Closed)
{
con.Open();
}
SqlCommand cmd1=新的SqlCommand(“ALTER DATABASE[“+DATABASE+”]设置具有立即回滚功能的单个用户”,con);
cmd1.ExecuteOnQuery();
SqlCommand cmd2=新的SqlCommand(“使用主还原数据库[“+数据库+”],从磁盘=”“+文件路径+”,替换为“”,con);
cmd2.ExecuteNonQuery();
SqlCommand cmd3=新的SqlCommand(“更改数据库[“+数据库+”]设置多用户”,con);
cmd3.ExecuteNonQuery();
con.Close();
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
con.Close();
}
我以这个解决方案结束。我的数据库名为Stats这将在没有安装MSSQL management studio的情况下工作
public void BackUpDB(string fname)
{
using (SqlConnection cn = new SqlConnection(_cstr))
{
cn.Open();
string cmd = "BACKUP DATABASE [Stats] TO DISK='" + fname + "'";
using (var command = new SqlCommand(cmd, cn))
{
command.ExecuteNonQuery();
}
}
}
public void RestoreDB(string fname)
{
using (SqlConnection cn = new SqlConnection(_cstr))
{
cn.Open();
#region step 1 SET SINGLE_USER WITH ROLLBACK
string sql = "IF DB_ID('Stats') IS NOT NULL ALTER DATABASE [Stats] SET SINGLE_USER WITH ROLLBACK IMMEDIATE";
using (var command = new SqlCommand(sql, cn))
{
command.ExecuteNonQuery();
}
#endregion
#region step 2 InstanceDefaultDataPath
sql = "SELECT ServerProperty(N'InstanceDefaultDataPath') AS default_file";
string default_file = "NONE";
using (var command = new SqlCommand(sql, cn))
{
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
default_file = reader.GetString(reader.GetOrdinal("default_file"));
}
}
}
sql = "SELECT ServerProperty(N'InstanceDefaultLogPath') AS default_log";
string default_log = "NONE";
using (var command = new SqlCommand(sql, cn))
{
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
default_log = reader.GetString(reader.GetOrdinal("default_log"));
}
}
}
#endregion
#region step 3 Restore
sql = "USE MASTER RESTORE DATABASE [Stats] FROM DISK='" + fname + "' WITH FILE = 1, MOVE N'Stats' TO '" + default_file + "Stats.mdf', MOVE N'Stats_Log' TO '"+ default_log+ "Stats_Log.ldf', NOUNLOAD, REPLACE, STATS = 1;";
using (var command = new SqlCommand(sql, cn))
{
command.ExecuteNonQuery();
}
#endregion
#region step 4 SET MULTI_USER
sql = "ALTER DATABASE [Stats] SET MULTI_USER";
using (var command = new SqlCommand(sql, cn))
{
command.ExecuteNonQuery();
}
#endregion
}
}
很抱歉我需要还原我尝试了以下操作:从磁盘恢复数据库MyDataBase='d:\MyDataBase.BAK'并出现此错误我尝试了以下操作:使用主还原MyDataBase到磁盘='d:\MyDATA.BAK,但仍然出现此错误:Msg 3159,级别16,状态1,第7行数据库“MyDataBase”的日志尾部尚未备份。如果日志中包含您不想丢失的工作,请将备份日志与NORECOVERY一起使用以备份日志。使用RESTORE语句的WITH REPLACE或WITH STOPAT子句只覆盖日志内容。Msg 3013,级别16,状态1,第7行还原数据库异常终止。在我的计算机上,访问这些库所需的DLL位于C:\Program Files(x86)\Microsoft SQL Server\110\SDK\程序集中(因为我已将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。为什么要使用dbPath和logPath行?它们似乎没有必要。您还可以通过使用restore.Devices.AddDevice(并传递您在new中使用的参数)使其更加简洁BackupDeviceItem@ChrisMoschini我相信他的意思是:RelocateFile relocatedafile=new RelocateFile(restore.ReadFileList(smoServer).Rows[0][0].ToString(),dbPath);restore.RelocateFiles.Add(重新定位的数据文件);