处理SQL命令并关闭连接

Mai*_*iOM 11 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

TestService.cs(42):CA2000:Microsoft.Reliability:在方法'TestService.GetByID(int)'中,在对对象'cmd'的所有引用都超出范围之前,调用对象'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;
    }
Run Code Online (Sandbox Code Playgroud)

如何处理DataTable对象?在使用中放置SqlCommand是一个好习惯吗?

谢谢

干杯

lnu*_*lnu 7

你也应该这样做:

using (SqlDataReader reader =
            cmd.ExecuteReader
                (CommandBehavior.CloseConnection))
        {
            table.Load(reader);
        }
Run Code Online (Sandbox Code Playgroud)

加载表时