我有以下功能:
public void RestoreDatabase(String databaseName, String backUpFile,
String serverName, String userName, String password)
{
SqlConnection.ClearAllPools();
ServerConnection connection = new ServerConnection
(serverName, userName, password);
Server sqlServer = new Server(connection);
Restore rstDatabase = new Restore();
rstDatabase.Action = RestoreActionType.Database;
rstDatabase.Database = databaseName;
BackupDeviceItem bkpDevice = new BackupDeviceItem
(backUpFile, DeviceType.File);
rstDatabase.Devices.Add(bkpDevice);
rstDatabase.ReplaceDatabase = true;
rstDatabase.SqlRestore(sqlServer);
}
在恢复备份之前,我试图先将数据库设置为单用户模式。我试过这段代码:
private string singleUserCmd = "alter database db-name set SINGLE_USER";
private string multiUserCmd = "alter database db-name set MULTI_USER";
private void SetSingleUser(bool singleUser,
SqlConnectionStringBuilder csb)
{
string v;
if (singleUser)
{
v = singleUserCmd.Replace("db-name", csb.InitialCatalog);
}
else
{
v = multiUserCmd.Replace("db-name", csb.InitialCatalog);
}
SqlCommand cmd = new SqlCommand(v, new SqlConnection
(csb.ToString()));
try
{
cmd.Connection.Open();
cmd.ExecuteNonQuery();
}
finally
{
cmd.Connection.Close();
}
}
问题似乎是单用户模式用于该连接,阻止其他任何人做任何事情。我需要它用于恢复备份的连接。
最佳答案
恢复需要在将数据库置于单用户模式的连接上进行,所以为什么不让您的 SetSingleUser 函数返回它执行时打开的 SqlConnection,然后让您的恢复代码接受并使用相同的打开连接。
private string singleUserCmd = "alter database db-name set SINGLE_USER";
private string multiUserCmd = "alter database db-name set MULTI_USER";
private SqlConnection SetSingleUser(bool singleUser, SqlConnectionStringBuilder csb)
{
string v;
if (singleUser)
{
v = singleUserCmd.Replace("db-name", csb.InitialCatalog);
}
else
{
v = multiUserCmd.Replace("db-name", csb.InitialCatalog);
}
SqlConnection connection = new SqlConnection(csb.ToString());
SqlCommand cmd = new SqlCommand(v, connection);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
return connection;
}
关于c# - 设置单用户模式恢复备份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1674179/