我目前有以下命令
SqlCommand command = new SqlCommand(@"sys.sp_detach_db 'DBname'", conn);
分离数据库,但在执行时抛出异常。说数据库正在使用中。如何在分离时或之前断开连接?
更新: 我目前正在使用SMO,但它仍无法正常工作:
bool DetachBackup(string backupDBName)
{
string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
var builder = new SqlConnectionStringBuilder(connectionString);
string serverName = builder.DataSource;
string dbName = builder.InitialCatalog;
try
{
Server smoServer = new Server(serverName);
smoServer.DetachDatabase(backupDBName + DateTime.Now.ToString("yyyyMMdd"), false);
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return false;
}
}
答案 0 :(得分:3)
在分离之前,您需要首先执行此SQL语句:
ALTER DATABASE YourDbNameHere
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
它将数据库设置为单用户模式,并立即丢弃任何活动连接。
答案 1 :(得分:2)
利用using statement
。
"使用"声明是为了确保对象尽快处理 它超出了范围,并且它不需要显式代码来确保 发生这种情况。
using(SqlCommand command = new SqlCommand(@"sys.sp_detach_db 'DBname'", conn))
{
//Processing command
}//Here it detach the connection and dispose the command
<强>更新强>
在您的情况下,问题是您在使用数据库时无法分离或重新附加数据库。来自MSDN的Here is an example,这将有助于您解决问题
可以分离数据库的数据和事务日志文件 然后重新连接到SQL Server的相同或另一个实例。 如果要更改数据库,则分离和附加数据库非常有用 数据库到同一台计算机上的不同SQL Server实例, 或者如果你想移动数据库。
答案 2 :(得分:2)
您可以使用SMO
使用SQL Server实例分离指定的数据库 在分离数据库之前更新统计信息的选项。
using Microsoft.SqlServer.Management.Smo;
void DetachDatabase()
{
Server smoServer = new Server("MSSQLSERVER2008");
smoServer.DetachDatabase("Yourdatabasename", False);
}
要从app.config获取服务器名称,您可以尝试这样:
string connectString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectString);
string serverName = builder.DataSource; //Server name
string dbName = builder.InitialCatalog; //Database name
答案 3 :(得分:0)