C# でストアードプロシージャの結果を SqlDataReader を使って取得する

ストアードプロシージャを実行して値を取得する

前回 「SqlDataReader を使って SQL Server データベースから値を取得する」 では、SqlDataReader を使ってアドホッククエリーの結果を取得しました。

SQL Server を使ってシステム開発をしていると、アドホッククエリーよりもストアードプロシージャを使うことが多いと思います。

今回は、SqlDataReader を使って、ストアードプロシージャを実行して値を取得してみましょう。


SqlDataReader で結果を取得する

SqlDataReader を使ってストアードプロシージャを実行して、データベースから取得したデータを読んで、コンソールに書き出してみましょう。


Test データベースにこのような Student テーブルがあります。

C# でストアードプロシージャの結果を SqlDataReader を使って取得する 1

次のストアードプロシージャを実行して、Student テーブルから Gender を指定してデータを取得してみましょう。

C# でストアードプロシージャの結果を SqlDataReader を使って取得する 2


以下のコードで、ストアードプロシージャを実行して、結果を SQL Server データベースからデータを取得することができます。

string connString = ConfigurationManager.ConnectionStrings["DB1"].ConnectionString;

using (SqlConnection conn = new SqlConnection(connString))
{
    conn.Open();

    SqlCommand comm = new SqlCommand("uspTest1", conn);
    comm.CommandType = CommandType.StoredProcedure;
    comm.Parameters.AddWithValue("@Gender", "M");

    using (SqlDataReader dr = comm.ExecuteReader())
    {
        while (dr.Read())
        {
            Console.WriteLine(string.Format("{0}: {1} {2}",
                                            dr["StudentNo"],
                                            dr["FirstName"],
                                            dr["LastName"]));
        }
    }
}

C# でストアードプロシージャの結果を SqlDataReader を使って取得する 3

config ファイルから値を取得するのに System.Configuration、CommandType を使うのにSystem.Data、SqlDataReader を使うのには System.Data.SqlClientが必要ですので、using ディレクティブで追加しておきます。

config ファイルからの接続文字列取得の方法を確認したい場合はこちらをご覧ください。
C# - データベースの接続文字列を App.config から取得する

このコードで行っている処理の流れは次の通りです。

  1. 接続文字列をコンストラクターに渡して SqlConnection を生成する。
  2. コネクションを open する。
  3. ストアドプロシージャ名とコネクションをコンストラクターに渡して SqlCommand を生成する。
  4. CommandType に StoredProcedure を設定する。
  5. AddWithValue で Gender をコマンドのパラメータに追加する。
  6. SqlCommand の ExecuteReader メソッドを呼んで、SqlDataReader を生成する。
  7. SqlDataReader の Read メソッド を While ループで実行することで、1 行ずつ読み込む。
  8. 読んだ行をコンソールにフォーマットして書き出す。

アドホッククエリーの時との違いは SqlCommand を生成する際にストアドプロシージャ名を渡して、CommandType に StoredProcedure を設定するところです。

SqlDataReader の Read メソッドはまだ行がある時は true、もうない時は false を返してくれるので、While(dr.Read()) としておけば 全行読み終わった時点で while ループを抜けてくれます。

SqlConnection や SqlDataReader は using ステートメントを使っておかないと、Exception でコードパスが飛んだ時に、Close し忘れる可能性がでてきてしまいますので、using を使いましょう。


こちらが実行結果です!

C# でストアードプロシージャの結果を SqlDataReader を使って取得する 4

© 2024 C# 入門