2015-12-13 86 views
0

我將sqlliteconnection對象分配給靜態變量並在函數中初始化它。爲什麼分配給靜態變量的sqlliteconnection被處置?

在某些情況下訪問sqlliteconnection對象時,它會拋出「sqlconnection object is disposed」異常。據我所知,靜態變量只有在應用程序關閉時纔會處理。

示例代碼:

public static SQLLiteConnection sql; 

public void OpenConnection() 
{ 
    sql = new SQLLiteConnection ; 
    //assign sql lite file path 
    sql.Open(); 
} 

public void GetStud() 
{ 
    OpenConnection(); 
//writing sqlcommand connection 
} 
} 

回答

0

你可以調用Dispose()即使是在靜態對象。它的目的是釋放非託管資源(託管資源由GC自動釋放)。僅在應用程序關閉後纔會調用Dispose。每當沒有對這個對象的引用時,它通常從終止方法(由GC調用)自動調用。它也被稱爲使用塊的結尾。

無論如何,靜態SqlConnection對象不是一個好主意。最好總是用「使用」來創建新的實例。

using (var conn = new SQLLiteConnection("connectionstring")) 
{ 
    conn.Open(); 
}//here is called Dispose() 
+0

感謝您的寶貴迴應。我可否知道靜態數據庫連接爲什麼不是最好的想法,至於我知道GC只清除未使用的對象。但我每次使用sqlconnection時都會初始化它,那麼GC如何將它視爲未使用的對象。雅我知道使用關鍵字是很好的。但是現在我無法改變整個應用程序。 –

+0

當它是靜態的時候,如果你通過更多的線程訪問它,事情將變得非常複雜。底層連接也有一些開銷。而當數據讀取器等其他非靜態對象引用此靜態字段時,GC可能不會收集該實例。在那裏它會出現一個你不想處理的問題的全新水平(噩夢難度):D –

相關問題