C# 正在处理SQL命令并关闭连接

C# 正在处理SQL命令并关闭连接,c#,sql,dispose,C#,Sql,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 Sq

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

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”未沿所有异常路径进行处理。在对象“表”上调用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中是一种好的做法吗

谢谢

干杯
  • 此方法的调用方应在使用完DataTable后调用返回的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);
    }
    

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

    您还应该这样做:

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

    加载表格时

    是。您的代码现在是正确的。始终处置实现IDisposable的类。但是SqlDataReader也是一次性的吗?您是否处理您返回的DataTable?我相信读卡器是一次性的是的,也许这就是表未被处理的问题,因为它包含一个未显式关闭的读卡器,虽然我希望在释放cmd时它会被隐式关闭,但您应该这样做:使用(SqlDataReader=command.ExecuteReader(CommandBehavior.CloseConnection)){dt.Load(reader);}@Kangkan什么意思是释放DataTable然后返回?我返回那个数据表,我不能在那里处理它。因为我的应用程序通常是web应用程序,我应该在什么时候调用对使用过的数据表的处理?假设在页面加载时,我将该方法调用与网格关联并绑定它。在哪里调用dispose方法?ThanksIt是我第一次看到这种方法。为什么MSDN上没有提到类似的内容?这是一种选择。MSDN仅显示了一个示例(简单)案例。是的,您也应该处理数据表。我的应用程序通常是web应用程序,我应该在什么时候调用已用数据表的处理?假设在页面加载时,我将该方法调用与网格关联并绑定它。在哪里调用dispose方法?感谢如果您将它与datagrid或gridview一起使用,那么没有好的方法来处理它,您可以保持原样。只有当您处于另一个上下文(如果datatable未直接绑定到控件)中时,才可以进行处置。此外,看起来(谷歌搜索)datatable中没有非托管资源,尽管它实现了IDisposable。