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

时间:2013-12-16 21:17:16

标签: vb.net class using sqlconnection class-library

我有一个全局类设置为

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 <中连接字符串的方法。 / p>

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

2 个答案:

答案 0 :(得分:4)

由于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

答案 1 :(得分:3)

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

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

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