显式关闭DataSet的底层连接?

时间:2010-07-07 13:22:25

标签: c# ado.net

我正在使用DataSet从Microsoft SQL Server检索数据。我是否需要显式关闭连接(或底层SqlDataAdapter自动关闭连接)?

我总是使用DataReader(使用使用),但第一次使用DataSet - 这就是为什么想知道最佳实践。提前谢谢。

5 个答案:

答案 0 :(得分:3)

DataSet是数据库上断开连接的“视图”。 也就是说,您在DataSet中加载数据库中的数据(实际上,在DataTable中,可以放在DataSet中),然后您可以关闭“用于填充DataTableDataSet

您可以继续使用数据集中的数据。它不需要与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,但现在你正在使用数据集。我假设这意味着您使用DataAdapterDataSet一起使用。如果是这种情况,并且您正在使用MSSQL,那么SqlDataAdapter将为您打开和关闭连接,但就像我说的,我喜欢自己跟踪这一点,特别是因为您可以使用{{1 (即使您在某些时候使用SqlCommand.ExecuteScalar),DataAdapter也无法管理您的连接状态。

SqlCommand doc: http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx

相关问题