处理SQL命令并关闭连接

本文关键字:连接 SQL 命令 处理 | 更新日期: 2023-09-27 18:17:40

到目前为止,我一直使用类似的结构从DB获取数据并填充数据表

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。可靠性:在方法'TestService.GetByID(int)'中,对象'table'不会沿着所有异常路径进行处理。在对象'table'的所有引用都超出作用域之前,调用System.IDisposable.Dispose。

TestService.cs (42): CA2000: Microsoft。可靠性:在方法'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中是一个好做法吗?

感谢

欢呼

处理SQL命令并关闭连接

你还应该这样做:

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

加载表

  • 这个方法的调用者应该在使用完这个方法后调用对返回的DataTable的dispose。
  • 是的,这是一个很好的做法,将SqlCommand内使用。

要"修复"你的DataTable问题,也许你可以修改你的函数。

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

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

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