【问题标题】:End Using SqlConnection Kills my global sqlConnection connection string结束使用 SqlConnection 杀死我的全局 sqlConnection 连接字符串
【发布时间】:2014-01-04 10:38:31
【问题描述】:

我有一个全局类设置

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

现在,当它到达 End Using 时,它应该清除 conn 中的连接字符串,但它也是如何清除 ReqGlobal.SqlConnection 中的连接字符串的一些方法/p>

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

【问题讨论】:

  • shared 连接?啊!默认情况下,您有一个连接池,它在后台管理物理连接。不需要shared 连接,这会导致几个问题。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多