我正在使用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