1

ストアド プロシージャを呼び出して結果を取得する必要があります。(すべてのプログラミングと同様に) これを行うにはさまざまな方法があり、Dispose()and/orを呼び出してリソースをクリーンアップする必要があることはわかっていClose()ます。this close or dispose question を読んで、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

あなたが書いたコードは、すべてのオブジェクトを適切に破棄するように見えます。

注意すべきことは、DataTable を破棄すると、そのオブジェクトが使用できなくなるということです。これは通常、DataTable の目的ではありません。通常、DataTable にデータを入力する場合、しばらくの間データを保持 (キャッシュ) し、クエリ メソッド内で破棄しないようにします。

于 2012-06-22T15:15:47.930 に答える
0

私の知る限り、IDisposableを実装していないため、ブロックを使用してDataTableまたはSqlDataAdapterをラップする必要はありません。

次のように、 using ステートメントを一緒に「チェーン」できます。

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

}
于 2012-06-22T14:59:38.740 に答える