如何在 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 自动关闭网站上的覆盖?

在 VB.net 中解压缩文件 [关闭]

VB.NET:即使在您关闭程序之后,您如何显示“您受到保护”消息?

vb.net 中的快速 OCR [关闭]

如何使用 Vb.net 在 Openoffice 中进行 Mailmerge

如何将公共事件从 c# 转换为 vb.net [关闭]