2010-07-07 132 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); 
    } 
} 
相关问题