我正在使用DataSet從Microsoft SQL Server檢索數據。我是否需要顯式關閉連接(或底層的SqlDataAdapter自動關閉連接)?顯式關閉DataSet的底層連接?
我總是使用DataReader(使用使用),但第一次使用DataSet - 這就是爲什麼想知道最佳實踐。提前致謝。
我正在使用DataSet從Microsoft SQL Server檢索數據。我是否需要顯式關閉連接(或底層的SqlDataAdapter自動關閉連接)?顯式關閉DataSet的底層連接?
我總是使用DataReader(使用使用),但第一次使用DataSet - 這就是爲什麼想知道最佳實踐。提前致謝。
在垃圾收集對象之前使用語句清理非託管資源。連接,是一個非託管資源,因此即使您使用DataSet也應該關閉。
只是爲了讓事情清楚我遵循傳統的初學者與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;
}
我始終認爲,跟蹤我的連接是個好主意,無論我連接到數據庫的方式如何。
你說你總是使用datareader,但現在你正在使用一個數據集。我假設這意味着您正在使用DataAdapter
來配合您的DataSet
。如果是這種情況,並且您正在使用MSSQL,那麼SqlDataAdapter
會爲您打開並關閉連接,但正如我所說的,我喜歡自己跟蹤此事,特別是因爲您可能使用SqlCommand.ExecuteScalar
(即使您正在使用大多數情況下爲DataAdapter
),並且SqlCommand
不會爲您管理您的連接狀態。
SqlDataAdapter
DOC: http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx
甲DataSet
是數據庫上的斷開連接的 '視圖'。 也就是說,您從DataSet
(實際上,在DataTable
中可以放入DataSet
)中加載數據庫中的數據,並且可以關閉用於填充DataTable
或DataSet
的連接。
您可以繼續處理數據集中的數據。它不需要打開連接到數據庫。
實際上,只要不需要任何數據庫訪問,您應該立即關閉數據庫連接。與數據庫的連接應該是短暫的。
最好的做法是呼籲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);
}
}
我不是目前使用的「使用」與數據集,那正是我想知道的嗎?處理DataSet時是否需要關閉?謝謝。 – 2010-07-07 14:25:37
如果您正在使用閱讀器,那麼您應該必須關閉/處理用於避免異常的適配器和/或閱讀器。請參閱下面的答案。 – 2010-07-07 15:04:20
Amit:正如我上面提到的,我已經在DataReaders中使用「使用」(它負責關閉)。我的問題只針對DataSets。請再讀一遍我的問題。謝謝。 – 2010-07-07 16:06:49