0

备份:

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 无法处理数据库“emp”,因为该会话正在使用它。建议在执行此操作时使用 master 数据库。RESTORE DATABASE 异常终止。

任何人都可以帮助我

4

4 回答 4

1

可能您应该按照它的建议使用主数据库。

为什么不使用 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);

祝你好运

于 2012-07-15T12:25:22.500 回答
0

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

查看单用户文档

于 2012-07-15T11:09:14.750 回答
0

您可能需要考虑在恢复之前终止当前会话:

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER

更多细节:

如何终止与 SQL Server 2005 数据库的所有当前连接?

于 2012-07-15T11:12:28.723 回答
0

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

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
于 2012-07-15T11:14:26.417 回答