Sql server 备份失败,“数据库正在使用”

Sql server 备份失败,“数据库正在使用”,sql-server,Sql Server,备份: 但当我恢复时: 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 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();
}
我得到一个错误:

还原无法处理数据库“emp”,因为此会话正在使用该数据库。建议在执行此操作时使用主数据库。 还原数据库正在异常终止


任何人都可以帮助我,请

通常,当您发出恢复命令时,您确实希望您的SQL数据库处于单用户模式,这样您就可以保证其他进程在发生这种情况时不会使用相同的数据库。如果当时有其他人在使用DB,您将看到当前看到的错误


查看文档

您可能想在恢复之前杀死当前会话:

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();
}
有关详细信息:


当您想要恢复SQL数据库时,请确保任何进程都不使用此数据库。 最好使用另一个名称来恢复数据库。 我编辑我的答案:

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER

也许你应该像它建议的那样使用主数据库

你为什么不使用SMO图书馆?down是一个如何使用SMO备份和恢复数据库的示例

如何进行备份

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
如何恢复:

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);

祝您好运

使用什么连接字符串恢复?使用SMO SQL Server管理对象库。是否读取错误消息?您尝试过它的建议吗?SqlConnection con=new SqlConnectionData Source=。\\SQLExpress;AttachDbFilename=|数据目录| \\emp.mdf;综合安全=真实;用户实例=True;初始目录=emp;我可以使用声音方法吗?我使用这个SqlConnection//SqlConnection con=new-SqlConnectionData-Source=。\\SQLExpress;AttachDbFilename=|数据目录| \\emp.mdf;综合安全=真实;用户实例=True;初始目录=emp;SqlCommand cmd=new SqlCommandrestore database NewDatabaseName from disk='C:\\emp.bak',con;我希望任何cod备份和花名册都使用此SqlConnection SqlConnection con=new SqlConnectionData Source=。\\SQLExpress;AttachDbFilename=|数据目录| \\emp.mdf;综合安全=真实;用户实例=True;初始目录=emp;如何下载SMO库我使用sql server 2008??您可以在sql server的安装路径中找到DLL,例如:C:\Program Files x86\Microsoft sql server\100\SDK\Assembly
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);