备份:
private void Button1_Click(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand("backup database emp to disk ='C:\\emp.bak'", con);
con.Open();
cmd.ExecuteNonQuery();
// ExecutenonQuery();
con.Close();
}
但是当我恢复时:
private void Button2_Click(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand("restore database emp from disk ='C:\\emp.bak'", con);
con.Open();
cmd.ExecuteNonQuery();
// ExecutenonQuery();
con.Close();
}
我收到错误:
RESTORE无法处理数据库'\ temp',因为此会话正在使用它。建议在执行此操作时使用master数据库。 RESTORE DATABASE异常终止。
任何人都可以帮助我
答案 0 :(得分:1)
可能你应该按照它的建议使用master数据库。
为什么不使用SMO库? down是使用SMO备份和恢复数据库的示例。
如何进行备份
Server server = new Server(sqlServer);
var bdi = new BackupDeviceItem(String.Format(@"C:\Opticien\Data\Sauvegardes\{0}", backupName), DeviceType.File);
var backup = new Backup() { Database = databaseName, Initialize = true };
backup.Devices.Add(bdi);
backup.SqlBackup(server);
如何恢复:
var server = new Server(sqlServer);
var restore = new Restore()
{
Database = database,
Action = RestoreActionType.Database,
ReplaceDatabase = true,
};
restore.Devices.AddDevice(backupPath, DeviceType.File);
var dt = restore.ReadFileList(server);
var dLogicalName = dt.Rows[0]["LogicalName"].ToString();
restore.RelocateFiles.Add(new RelocateFile(dLogicalName, String.Format(@"C:\Opticien\Data\{0}.mdf", database)));
restore.RelocateFiles.Add(new RelocateFile(dLogicalName + "_Log", String.Format(@"C:\Opticien\Data\{0}.ldf", database)));
restore.SqlRestore(server);
祝你好运
答案 1 :(得分:0)
通常,在发出还原命令时,您确实希望SQL数据库处于单用户模式,以便在发生这种情况时可以保证其他进程不使用相同的数据库。如果其他人当时正在使用数据库,您将收到类似于您目前看到的错误。
查看Single User文档
答案 2 :(得分:0)
您可能需要考虑在恢复之前终止当前会话:
use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE
--do you stuff here
ALTER DATABASE YourDatabase SET MULTI_USER
更多详情:
How do you kill all current connections to a SQL Server 2005 database?
答案 3 :(得分:0)
如果要还原SQL数据库,请确保任何进程都不使用此数据库。 它最好使用另一个名称来恢复数据库。 我编辑我的答案:
DECLARE @SPId int
DECLARE @SQL nvarchar(100)
--SET @DatabaseName = N'AdventureWorks2008'
SET @DatabaseName = DB_NAME()
DECLARE my_cursor CURSOR FAST_FORWARD FOR
SELECT SPId FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId
OPEN my_cursor
FETCH NEXT FROM my_cursor INTO @SPId
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'KILL ' + CAST(@SPId as nvarchar(10))
print @SQL
EXEC sp_executeSQL @SQL
--KILL @SPId -- Causing Incorrect syntax near '@spid'.
FETCH NEXT FROM my_cursor INTO @SPId
END
CLOSE my_cursor
DEALLOCATE my_cursor