2013-12-16 50 views
1

我有一個全球性的類設置爲末使用的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

有人可以解釋我在這裏做錯了什麼,以及爲什麼它在兩個地方清除連接字符串,請。如果有問題,這是一個班級圖書館。

+1

了'shared'連接?啊!你有一個默認的連接池,用於管理物理連接。不需要可能導致幾個問題的「共享」連接。 –

回答

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 
3

End Using對您的全局連接對象調用Dispose方法,因此您將無法在以後使用它。

請勿使用全局連接。相反,初始化在全球範圍內的連接錯誤字符串,並創建一個新的SqlConnection對象要執行一個查詢每次:

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