我正在使用DataSet从Microsoft SQL Server检索数据。我是否需要显式关闭连接(或底层SqlDataAdapter自动关闭连接)?
我总是使用DataReader(使用使用),但第一次使用DataSet - 这就是为什么想知道最佳实践。提前谢谢。
答案 0 :(得分:3)
DataSet
是数据库上断开连接的“视图”。
也就是说,您在DataSet
中加载数据库中的数据(实际上,在DataTable
中,可以放在DataSet
中),然后您可以关闭“用于填充DataTable
或DataSet
。
您可以继续使用数据集中的数据。它不需要与DB的开放连接。
事实上,一旦不需要任何数据库访问,就应该立即关闭数据库连接。与数据库的连接应该是短暂的。
答案 1 :(得分: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);
}
}
答案 2 :(得分:0)
在对象被垃圾回收之前,使用语句清理非托管资源。连接是一种非托管资源,因此即使您使用的是DataSet也应该关闭。
答案 3 :(得分: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;
}
答案 4 :(得分:0)
我一直认为跟踪我的连接是个好主意,无论我连接数据库的方式如何。
你说你总是使用datareader,但现在你正在使用数据集。我假设这意味着您使用DataAdapter
与DataSet
一起使用。如果是这种情况,并且您正在使用MSSQL,那么SqlDataAdapter
将为您打开和关闭连接,但就像我说的,我喜欢自己跟踪这一点,特别是因为您可以使用{{1 (即使您在某些时候使用SqlCommand.ExecuteScalar
),DataAdapter
也无法管理您的连接状态。
SqlCommand
doc:
http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx