この節ではADO.NETによるストアドプロシージャ呼び出しを紹介します。ExecuteNonQueryで影響を受けた行数を取得しつつ、ストアドプロシージャのReturn戻り値を受け取る実装を示します。
1. データベース ストアドプロシージャ定義
create procedure mynewproc(@id int)
as
begin
declare @cout int
-- 更新クエリ
update Article set title = '111' where id = @id
-- 引数より大きなidのレコード件数を集計
select @cout = count(1) from Article where id > @id
-- returnで数値を返却(SQL Serverストアドプロシージャのreturnはint型のみ対応)
return @cout
endCode language: PHP (php)
重要ポイント:
return @coutはストアドプロシージャの戻り値であり、出力パラメータのoutputとは別物です。
2. C#からの呼び出し
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand("mynewproc", connection);
command.CommandType = CommandType.StoredProcedure;
// 【重要】Return戻り値パラメータを登録、名前はReturnValueに固定
SqlParameter para = new SqlParameter(
"ReturnValue",
SqlDbType.Int,
4,
ParameterDirection.ReturnValue,
false,0,0,string.Empty,DataRowVersion.Default,null);
command.Parameters.Add(para);
// ストアドプロシージャ入力パラメータ @id
SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
param.Value = 4;
param.Direction = ParameterDirection.Input;
command.Parameters.Add(param);
// ExecuteNonQuery:INSERT/UPDATE/DELETEを実行し、【UPDATE文の影響行数】を返す
int rowsAffected = command.ExecuteNonQuery();
// ストアドプロシージャのreturnが返した値を取得
int result = (int)command.Parameters["ReturnValue"].Value;
}Code language: PHP (php)
推奨コード
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("mynewproc", conn))
{
conn.Open();
cmd.CommandType = CommandType.StoredProcedure;
// 戻り値パラメータ登録(名前固定:ReturnValue、方向はReturnValue必須)
cmd.Parameters.Add("ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
// 入力パラメータ
cmd.Parameters.Add("@id", SqlDbType.Int).Value = 4;
// rowsAffected = UPDATE文で変更されたレコード数
int rowsAffected = cmd.ExecuteNonQuery();
// ストアドプロシージャ return @cout の値を受け取る
int procReturnVal = (int)cmd.Parameters["ReturnValue"].Value;
}Code language: JavaScript (javascript)
注意点
1. int rowsAffected = command.ExecuteNonQuery();
- 意味:DML文(update/delete/insert)によって影響を受けた行数
- 本サンプル:
update Article set title='111' where id=@idがマッチし更新したレコード件数 - ストアドプロシージャのreturn戻り値ではありません。両者は完全に独立しています
2. ReturnValue 戻り値パラメータ
- パラメータ名は固定文字列
ReturnValueを強制、独自の名前に変更不可 Direction = ParameterDirection.ReturnValue- SQL Serverストアドプロシージャの
return 数値はint型のみ渡せる ExecuteNonQuery()実行後でなければこのパラメータの値を読み取れない
return戻り値:1つだけ指定可、int型限定output出力パラメータ:複数設定可能、各種データ型に対応
違い
-- ストアドプロシージャ内部
update Article set title='111' where id=4; -- 1件更新されると仮定
return 10; -- returnによる戻り値Code language: PHP (php)
実行後:
rowsAffected = 1(UPDATEの影響行数)procReturnVal = 10(returnから返された値)
まとめ
| メソッド | 戻り値 | 利用シーン |
|---|---|---|
| ExecuteReader | SqlDataReader(ストリーム複数行) | 複数レコードの取得 |
| SqlDataAdapter.Fill | DataSet/DataTable(オフラインテーブル) | WinFormコントロールへのテーブルバインド |
| ExecuteScalar | object(先頭行先頭列) | 単一の集計結果だけ必要な場合 |
| ExecuteNonQuery | int(影響行数)+ReturnValue戻り値 | 追加/更新/削除、ストアドプロシージャからステータスコードを受け取る場合 |
ストアドプロシージャ Return
Previous: SqlDataAdapter