C# でストアードプロシージャの結果を SqlDataReader を使って取得する
ストアードプロシージャを実行して値を取得する
前回 「SqlDataReader を使って SQL Server データベースから値を取得する」 では、SqlDataReader を使ってアドホッククエリーの結果を取得しました。
SQL Server を使ってシステム開発をしていると、アドホッククエリーよりもストアードプロシージャを使うことが多いと思います。
今回は、SqlDataReader を使って、ストアードプロシージャを実行して値を取得してみましょう。
SqlDataReader で結果を取得する
SqlDataReader を使ってストアードプロシージャを実行して、データベースから取得したデータを読んで、コンソールに書き出してみましょう。
Test データベースにこのような Student テーブルがあります。
次のストアードプロシージャを実行して、Student テーブルから Gender を指定してデータを取得してみましょう。
以下のコードで、ストアードプロシージャを実行して、結果を 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"])); } } }
config ファイルから値を取得するのに System.Configuration、CommandType を使うのにSystem.Data、SqlDataReader を使うのには System.Data.SqlClientが必要ですので、using ディレクティブで追加しておきます。
C# - データベースの接続文字列を App.config から取得する
このコードで行っている処理の流れは次の通りです。
- 接続文字列をコンストラクターに渡して SqlConnection を生成する。
- コネクションを open する。
- ストアドプロシージャ名とコネクションをコンストラクターに渡して SqlCommand を生成する。
- CommandType に StoredProcedure を設定する。
- AddWithValue で Gender をコマンドのパラメータに追加する。
- SqlCommand の ExecuteReader メソッドを呼んで、SqlDataReader を生成する。
- SqlDataReader の Read メソッド を While ループで実行することで、1 行ずつ読み込む。
- 読んだ行をコンソールにフォーマットして書き出す。
アドホッククエリーの時との違いは SqlCommand を生成する際にストアドプロシージャ名を渡して、CommandType に StoredProcedure を設定するところです。
SqlDataReader の Read メソッドはまだ行がある時は true、もうない時は false を返してくれるので、While(dr.Read()) としておけば 全行読み終わった時点で while ループを抜けてくれます。
SqlConnection や SqlDataReader は using ステートメントを使っておかないと、Exception でコードパスが飛んだ時に、Close し忘れる可能性がでてきてしまいますので、using を使いましょう。
こちらが実行結果です!