如果在C#中的Using语句内调用Connection close事件会发生什么

时间:2015-05-22 03:49:36

标签: c# sql

我的假设是,如果Sqlconnection在使用语句中打开,则在执行语句后将自动发生dispose事件,如果我强制关闭与Using Statement中的连接将会发生什么是坏事练习?

using (SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["Constring"]))
{
    // SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["Constring"]);
    conn.Open();

    String query = String.Empty;
    query = "exec " + StoredProcedure + " " + sampleproc + "";

    using (SqlDataAdapter mainTableAdapter = new SqlDataAdapter(query, conn))
    {
        System.Data.DataSet mainTableDS = new System.Data.DataSet();
        mainTableAdapter.Fill(mainTableDS);

        conn.Close();
        mainTableAdapter.Dispose();
        conn.Dispose();

        return mainTableDS;
    }
}

2 个答案:

答案 0 :(得分:2)

  1. 无需同时调用Close()Dispose();调用Dispose()将自动关闭连接并处置该对象。

  2. 无需在Close()块内调用Dispose()usingusing语句自动处理对象(由于上面的#1也会关闭连接)。

  3. 另外,关于#2的注释。如果Microsoft的guidance is followed

    可以安全地多次拨打Dispose()
      

    如果对象的Dispose方法被多次调用,则该对象   必须忽略第一个之后的所有呼叫。该对象不得抛出   如果多次调用Dispose方法,则会出现异常。例   Dispose以外的方法可以在何时抛出ObjectDisposedException   资源已经处理完毕。

答案 1 :(得分:1)

我只是将其添加为答案,因为它不适合评论,但除了其他答案中的所有内容外,您还无需致电conn.Open(). {{1} }方法会为你照顾它。上面的整个20行样本可以简化为这个简短的8行代码段而不会丢失任何功能:

Fill()