繁体   English   中英

通过使用Statement和Dispose处理DataTable,SqlConnection,SqlCommand和SqlDataAdapter清理资源

[英]Cleaning Up Resources via Using Statement & Dispose for DataTable, SqlConnection, SqlCommand, & SqlDataAdapter

我必须调用存储过程并获取结果。 我知道这样做的方式多种多样(与所有编程一样),我应该通过调用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 ,但这不是我在这里要查找的,因为我将对非标量调用使用通用格式。

AFAIK您不需要在使用块中包装DataTable或SqlDataAdapter,因为它们不实现IDisposable。

您可以像这样将“使用”语句“链接”在一起:

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

}

您编写的代码似乎确实可以正确处理所有对象。

您应该知道的是,处理DataTable会使该对象不可用,这通常不是DataTable的意图。 通常,如果要填充数据表,则打算将数据保留(缓存)一段时间,而不是在查询方法中将其丢弃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM