如何在 vb.net 中完全关闭 SQLConnection 字符串?
Posted
技术标签:
【中文标题】如何在 vb.net 中完全关闭 SQLConnection 字符串?【英文标题】:How do you completely close an SQLConnection string in vb.net? 【发布时间】:2011-05-16 18:35:45 【问题描述】:我正在运行一个连接到数据库的多线程应用程序,当我完成它们时连接会关闭(并且我会处理所有线程)。我尝试清除连接池,设置 pooling=false 并且我同时使用了 .dispose 和 .close。
如果我在连接全部关闭后尝试删除所连接的数据库,则会收到错误消息“无法删除数据库 X,因为它当前正在使用中”。以下是我的代码:
Dim comExecuteInsert As New SqlCommand
Dim comm As New SqlConnection
If (Not comm Is Nothing) Then
comm = Nothing
End If
comExecuteInsert.Connection = comm
comExecuteInsert.CommandType = CommandType.StoredProcedure
comExecuteInsert.CommandText = strProcedureName
comExecuteInsert.CommandTimeout = 26000
comExecuteInsert.Parameters.Add("@tableName", SqlDbType.VarChar, 100).Value = strTableName
comExecuteInsert.Parameters.Add("@filename", SqlDbType.VarChar, 500).Value = strFileName
comExecuteInsert.ExecuteScalar()
comExecuteInsert.Parameters.Clear()
comExecuteInsert = Nothing
comm.Close()
SqlConnection.ClearPool(comm)
存储过程创建临时表,然后将这些临时表删除并将数据插入到数据库中现有的表中。
【问题讨论】:
您是在尝试删除数据库还是只是确保关闭连接(实际上将连接返回到连接池,然后才真正关闭它)? @mellamokb 我在代码的倒数第二行关闭了与 comm.Close() 的连接。 @Thomas 我想关闭连接并删除数据库。 您想在代码中删除数据库? @Thomas 是的,但我可以在打开连接之前成功地做到这一点。 【参考方案1】:如果您尝试关闭与数据库的任何连接以便删除它,您可以对 Management Studio 中的 master
数据库执行以下操作:
Alter Database MyDatabaseName Set Single_User With Rollback Immediate
GO
Drop Database MyDatabaseName
GO
要在代码中执行此操作,您需要打开到master
数据库的单独连接并单独执行上述每个语句(而不是尝试执行GO
字词)。请记住,这将终止与数据库的所有连接,包括您自己以外的连接,无论他们在做什么。
【讨论】:
【参考方案2】:我错过了您所说的要删除数据库的那一点。你需要使用
SqlConnection.ClearAllPools()
SQL Server 缓存连接以供重复使用。以上清除缓存的连接。
例如...
Sub Demo_DropDatabase(ByVal strCnn As String, ByVal strDBName As String)
Using cnnSQLS As New SqlConnection(strCnn)
SqlConnection.ClearAllPools()
cnnSQLS.Open()
Dim strSQL As String = "DROP DATABASE [" & strDBName & "]"
Using cmdDrop As New SqlCommand(strSQL, cnnSQLS)
cmdDrop.ExecuteNonQuery() 'N.B. may throw exception '
End Using
cnnSQLS.Close()
End Using
End Sub
【讨论】:
【参考方案3】:你没有处理你的命令对象。
代替
comExecuteInsert = Nothing
试试
comExecuteInsert.Dispose
或尝试以下方法:
Using comm As New SqlConnection
Using comExecuteInsert As New SqlCommand
comExecuteInsert.Connection = comm
comExecuteInsert.CommandType = CommandType.StoredProcedure
comExecuteInsert.CommandText = strProcedureName
comExecuteInsert.CommandTimeout = 26000
comExecuteInsert.Parameters.Add("@tableName", SqlDbType.VarChar, 100).Value = strTableName
comExecuteInsert.Parameters.Add("@filename", SqlDbType.VarChar, 500).Value = strFileName
comExecuteInsert.ExecuteScalar()
comExecuteInsert.Parameters.Clear()
comm.Close()
End Using
End Using
【讨论】:
【参考方案4】:使用 using 关键字,见Does End Using close an open SQL Connection
【讨论】:
我已经尝试过了,但它不起作用,也许我的存储过程中有一些东西使我的数据库保持打开状态。【参考方案5】:在您的 VB.Net 代码中使用下面的 T-SQL 来删除现有连接。
TSQL
declare @vSqlTx AS varchar(max);
select @vSqlTx = concat(@vSqlTx, ' KILL ', spid, ';', CHAR(13))
from sys.sysprocesses
where DB_NAME(NULLIF(dbid, 0)) = <'yourDatabaseName'>
and spid != @@spid;
print @vSqlTx;
exec (@vSqlTx);
VB.NET 代码:
Private Sub CloseAllOtherConnections(ByVal conStr As String, ByVal databaseName As String)
Dim strSqlText As String
Using con As New SqlConnection(conStr)
SqlConnection.ClearAllPools()
con.Open()
strSqlText = " declare @vSqlTx AS varchar(max);
select @vSqlTx = concat(@vSqlTx, ' KILL ', spid, ';', CHAR(13))
from sys.sysprocesses
where DB_NAME(NULLIF(dbid, 0)) = '" & databaseName & "'
and spid != @@spid;
print @vSqlTx;
exec (@vSqlTx); "
Dim cmd As New SqlCommand(strSqlText, con)
cmd.ExecuteNonQuery()
con.Close()
End Using
End Sub
【讨论】:
以上是关于如何在 vb.net 中完全关闭 SQLConnection 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
VB.NET:即使在您关闭程序之后,您如何显示“您受到保护”消息?