处理SQL命令并关闭连接

时间:2011-12-12 14:38:04

标签: c# sql dispose

到目前为止,我总是使用类似的结构从DB获取数据并填充DataTable

public static DataTable GetByID(int testID)
        {
        DataTable table = new DataTable();
        string query = @"SELECT * FROM tbl_Test AS T WHERE T.testID = @testID";

        using (SqlConnection cn = new SqlConnection(Configuration.DefaultConnectionString))
        {
            SqlCommand cmd = new SqlCommand(query, cn);
            cmd.Parameters.Add("@testID", SqlDbType.Int).Value = testID;

            cn.Open();
            table.Load(cmd.ExecuteReader());
        }

        return table;
    }

现在我在构建分析中看到了一些警告:

TestService.cs(37):CA2000:Microsoft.Reliability:在方法'TestService.GetByID(int)'中,对象'table'未沿所有异常路径放置。在对对象'table'的所有引用超出范围之前,调用System.IDisposable.Dispose。

TestService.cs(42):CA2000:Microsoft.Reliability:在方法'TestService.GetByID(int)'中,在对所有引用超出范围之前,在对象'cmd'上调用System.IDisposable.Dispose。

我应该在

中更改我的代码
    public static DataTable GetByID(int testID)
    {
        DataTable table = new DataTable();
        string query = @"SELECT * FROM tbl_Test AS T WHERE T.testID = @testID";

        using (SqlConnection cn = new SqlConnection(Configuration.DefaultConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand(query, cn))
            {
                cmd.Parameters.Add("@testID", SqlDbType.Int).Value = testID;

                cn.Open();
                table.Load(cmd.ExecuteReader());
            }
        }

        return table;
    }

如何处理DataTable对象? 将SqlCommand放在using?

中是一个好习惯

由于

干杯

3 个答案:

答案 0 :(得分:7)

你也应该这样做:

using (SqlDataReader reader =
            cmd.ExecuteReader
                (CommandBehavior.CloseConnection))
        {
            table.Load(reader);
        }

加载表时

答案 1 :(得分:3)

  • 此方法的调用者应该在使用它时调用返回的DataTable的处置。
  • 是的,最好将SqlCommand放在里面使用。

答案 2 :(得分:1)

要使用DataTable“修复”您的问题,也许您可​​以修改您的功能。

public static void GetByID(DataTable table, int testID)
{
    // bla bla bla
}


// calling the function
using(DataTable table = new DataTable())
{
    TestService.GetByID(table, 5);
}

不是说这是最佳解决方案,但它会解决投诉。