如何在vb.net中完全关闭SQLConnection字符串?

时间:2011-05-16 18:35:46

标签: sql vb.net

我正在运行一个连接到数据库的多线程应用程序,当我完成它们时连接已关闭(并且我处理了所有线程)。我已经尝试清除连接池,设置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)

存储过程创建临时表,稍后将其删除并将数据插入数据库中存在的表中。

5 个答案:

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