2010-07-07 129 views
5

我正在使用DataSet從Microsoft SQL Server檢索數據。我是否需要顯式關閉連接(或底層的SqlDataAdapter自動關閉連接)?顯式關閉DataSet的底層連接?

我總是使用DataReader(使用使用),但第一次使用DataSet - 這就是爲什麼想知道最佳實踐。提前致謝。

回答

0

在垃圾收集對象之前使用語句清理非託管資源。連接,是一個非託管資源,因此即使您使用DataSet也應該關閉。

+0

我不是目前使用的「使用」與數據集,那正是我想知道的嗎?處理DataSet時是否需要關閉?謝謝。 – 2010-07-07 14:25:37

+0

如果您正在使用閱讀器,那麼您應該必須關閉/處理用於避免異常的適配器和/或閱讀器。請參閱下面的答案。 – 2010-07-07 15:04:20

+0

Amit:正如我上面提到的,我已經在DataReaders中使用「使用」(它負責關閉)。我的問題只針對DataSets。請再讀一遍我的問題。謝謝。 – 2010-07-07 16:06:49

0

只是爲了讓事情清楚我遵循傳統的初學者與db交互的方式。

public DataSet GetData() 
{ 
    SqlDataReader reader; 
    string connstr = your conn string; 
    SqlConnection conn = new SqlConnection(connstr); 
    DataTable st = new DataTable(); 
    DataSet ds = new DataSet(); 
    try 
    {     
     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandText = "Your select query"; 
     cmd.Connection = conn; 
     conn.Open(); 

     reader = cmd.ExecuteReader(); 
     dt.Load(reader); 
     ds.Tables.Add(dt); 
    } 
    catch (Exception ex) 
    { 
     // your exception handling 
    } 
    finally 
    { 
     reader.Close(); 
     reader.Dispose(); 
     conn.Close(); 
     conn.Dispose(); 
    }  
    return ds; 
} 
0

我始終認爲,跟蹤我的連接是個好主意,無論我連接到數據庫的方式如何。

你說你總是使用datareader,但現在你正在使用一個數據集。我假設這意味着您正在使用DataAdapter來配合您的DataSet。如果是這種情況,並且您正在使用MSSQL,那麼SqlDataAdapter會爲您打開並關閉連接,但正如我所說的,我喜歡自己跟蹤此事,特別是因爲您可能使用SqlCommand.ExecuteScalar(即使您正在使用大多數情況下爲DataAdapter),並且SqlCommand不會爲您管理您的連接狀態。

SqlDataAdapter DOC: http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx

3

DataSet是數據庫上的斷開連接的 '視圖'。 也就是說,您從DataSet(實際上,在DataTable中可以放入DataSet)中加載數據庫中的數據,並且可以關閉用於填充DataTableDataSet的連接。

您可以繼續處理數據集中的數據。它不需要打開連接到數據庫。

實際上,只要不需要任何數據庫訪問,您應該立即關閉數據庫連接。與數據庫的連接應該是短暫的。

1

最好的做法是呼籲Dispose()所有ADO.NET成員實現IDisposable:連接,命令,適配器,表,設置,閱讀器等:

using (SqlConnection connection = new SqlConnection(connectionString)) 
using (SqlCommand command = connection.CreateCommand()) 
{ 
    connection.Open(); 
    using (DataSet ds = new DataSet()) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
    { 
     adapter.Fill(ds); 
    } 
} 
相關問題