1

我必须调用一个存储过程并获得结果。Dispose()我知道有多种方法可以做到这一点(就像所有编程一样),我应该通过调用和/或来清理资源Close()。阅读这个close or dispose问题,我认为我应该使用该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,但这不是我在这里寻找的,因为我将使用非标量调用的一般格式。

4

2 回答 2

0

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

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

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

}
于 2012-06-22T14:59:38.740 回答
0

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

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

于 2012-06-22T15:15:47.930 回答