通过使用语句和处置的数据表,SqlConnection的,SqlCommand的,与SqlDataA

2019-09-18 09:18发布

我要调用存储过程并获得满意的结果。 我知道有这样做的各种方式(与所有程序),我应该通过调用清理资源Dispose()和/或Close() 读了这接近或处置的问题,我想,我应该使用using语句,这应该是足够的。 下面就是我正在做我的电话。 我的问题是 - 我会在这个复杂而这将清理所有的资源?

private Int32 CallStoredProcedure(Int32 Id)
{
    using (var dt = new DataTable())
    {
        using (var conn = new SqlConnection(ConnectionString))
        {
            using (var sqlCmd = new SqlCommand("SEL_StoredProcedure", conn))
            {
                using (var sda = new SqlDataAdapter(sqlCmd))
                {
                    sqlCmd.CommandType = System.Data.CommandType.StoredProcedure;
                    sqlCmd.Parameters.AddWithValue("@ID", Id);
                    sqlCmd.Connection.Open();

                    sda.Fill(dt);
                }
            }
        }

        if (dt.Rows.Count == 1)
            return Convert.ToInt32(dt.Rows[0]["IDv2"]);
        else if (dt.Rows.Count > 1)
            throw new Exception("Multiple records were found with supplied ID; ID = " + studentId.ToString());
    }
    return 0;
}

PS -我知道我可以打电话ExecuteScalar ,但是这不是我要找的,因为在这里我将使用通用格式的非标通话。

Answer 1:

你写的代码确实出现了妥善处置所有对象。

什么,你应该知道的是,设置一数据表,使该对象不可用,这不是通常与一个DataTable的意图。 通常,如果你是填充一个DataTable你打算保持数据左右(缓存)了一段时间,并且查询方法中没有丢弃它。



Answer 2:

据我所知,你不需要包裹数据表或SqlDataAdapter的使用块,因为他们没有实现IDisposable。

你可以在“链”的using语句toegether这样的:

using(var conn = new SqlConnection(connectionString))
using(var cmd = new SqlCommand("SEL_storedProcedure", conn))
{

}


文章来源: Cleaning Up Resources via Using Statement & Dispose for DataTable, SqlConnection, SqlCommand, & SqlDataAdapter