C#分离数据库时如何断开连接

时间:2015-10-06 05:25:53

标签: c# sql-server

我目前有以下命令

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

4 个答案:

答案 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)

尝试以下

location.reload()

Aaron Bertrand在我们的姐妹网站question

上提到过