结束使用SqlConnection会终止我的全局SqlConnection连接字符串



我有一个全局类设置为

Public Class ReqGlobal
  Private Shared _sqlConn As SqlClient.SqlConnection
  Public Shared Property SqlConnection As SqlClient.SqlConnection
    Get
        Return _sqlConn
    End Get
    Set(value As SqlClient.SqlConnection)
        _sqlConn = value
    End Set
  End Property
  Private Sub New()
    ' Prevents users from making this an instance
  End Sub
End Class

然后在我的表格上,我会运行以下代码:

Dim sqlConn as SqlConnection = ReqGlobal.SqlConnection
Using conn As SqlClient.SqlConnection = sqlConn 
            conn.Open()
            Using bulkCopy As SqlClient.SqlBulkCopy = New SqlClient.SqlBulkCopy(conn)
                bulkCopy.DestinationTableName = "tableName"
                bulkCopy.WriteToServer(dt)
            End Using
End Using

现在,当它到达"结束使用"时,它会按照应该的方式清除conn中的连接字符串,但它也会在ReqGlobal.SqlConnection中清除连接字符串

有人能解释一下我在这里做错了什么,以及为什么要清除两个地方的连接字符串吗。如果重要的话,这是一个类库。

由于SqlConnection是一个引用类型,当您在using语句中分配conn时,将使用实际的全局连接,而不是副本
当使用范围结束时,Disposed在全局连接上被调用,它变得无用。对于线程安全问题(以及其他问题),您不应该使用这样的全局连接。

我建议使用全局类中的连接字符串在using语句中创建一个新连接,或者在全局类中调用一个创建连接的方法。

Public Class ReqGlobal
   private shared _cnnStr As string = "someConnectionString"
   Public Shared Function GetConnection() As DbConnection
      Dim con = new SqlClient.SqlConnection(_cnnStr)
      con.Open()
      return con
   End Function
End Class

使用

Using conn As DbConnection = ReqGlobal.GetConnection()
...
End Using

End Using在全局连接对象上调用Dispose方法,因此之后将无法使用它。

不要使用全局连接。相反,在全局级别初始化连接字符串,并在每次执行查询时创建一个新的SqlConnection对象:

Using connection = New SqlClient.SqlConnection(_connectionString)
    ' Your code
End Using

最新更新