如何以编程方式关闭与DB的所有现有连接

San*_*nke 8 c# database sql-server entity-framework restore

我想关闭与SQL Server的现有连接,以便我可以对该数据库进行还原.我正在使用实体框架.我试着执行

alter database YourDb 
set single_user with rollback immediate
Run Code Online (Sandbox Code Playgroud)

但后来我得到一个例外

连接未关闭

我无法弄清楚为什么连接不允许关闭?

此图像显示完整的例外情况

在此输入图像描述

这是方法,

 public void dbQueueryExctr(string queuery)
        {
            SqlCommand cmd = new SqlCommand();
            SqlDataReader reader;


            using (SqlConnection connectionx = new SqlConnection(CONNECTIONSTRING))
            {

                connectionx.Open();
                //connectionx.Open(); // Removed
                cmd.CommandText = queuery;
                cmd.CommandType = CommandType.Text;
                cmd.Connection = connectionx;

                reader = cmd.ExecuteReader();
                connectionx.Close();


            }
Run Code Online (Sandbox Code Playgroud)

编辑: 我删除了第一个.Open().现在我只有Open()

Def*_*ult 11

似乎Entity Framework保持与数据库的连接.您可以看到它sp_who2在SQL Server Management Studio中执行,其中Entity Framework 在ProgramName 下列为EntityFrameworkMUE.

您不必使用"原始"sql语句来断开活动连接,它也可以通过这种方式解决:

Server server = new Server(".\\SQLEXPRESS");
Database database = new Database(server, dbName);
database.Refresh();
server.KillAllProcesses(dbName);
database.DatabaseOptions.UserAccess = DatabaseUserAccess.Single;
database.Alter(TerminationClause.RollbackTransactionsImmediately);

//restore.SqlRestore(server);
Run Code Online (Sandbox Code Playgroud)

  • 如果有人正在寻找服务器的命名空间:Microsoft.SqlServer.Management.Smo (3认同)

Sco*_*ain 8

当您Open()连接两次连接时,您会收到该错误.您应该创建在using块内创建的所有SqlConnection对象,并且只打开它们一次.

如果您正在重复使用连接"以使其更快",.NET已经通过连接池默认为您执行此操作,但您必须处置连接对象以使其工作.

  • 您没有清除连接池,您的错误来自您的两个Open()调用.现在你摆脱了第二个Open(),你可能会遇到不同的错误.你应该回滚你的更改并用你得到的新错误问一个新问题(如果你得到同样的错误,你在你的程序中有另一个你打开两次打开的位置,检查堆栈跟踪.) (2认同)