我正在运行一个连接到数据库的多线程应用程序,当我完成它们时连接已关闭(并且我处理了所有线程)。我已经尝试清除连接池,设置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)
存储过程创建临时表,稍后将其删除并将数据插入数据库中存在的表中。
答案 0 :(得分:2)
如果您尝试关闭与数据库的任何连接以便可以删除它,则可以对Management Studio中的master
数据库执行以下操作:
Alter Database MyDatabaseName Set Single_User With Rollback Immediate
GO
Drop Database MyDatabaseName
GO
要在代码中执行此操作,您需要打开与master
数据库的单独连接,并单独执行上述每个语句(而不是尝试执行GO
个字)。请记住,无论他们在做什么,都会杀死与数据库的所有连接,包括您自己的连接。
答案 1 :(得分: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
答案 2 :(得分:1)
使用using关键字,请参阅Does End Using close an open SQL Connection
答案 3 :(得分:1)
您没有处置命令对象。
而不是
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 :(得分:0)
在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