ストアドプロシージャ Return

この節では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 戻り値パラメータ
  1. パラメータ名は固定文字列 ReturnValue を強制、独自の名前に変更不可
  2. Direction = ParameterDirection.ReturnValue
  3. SQL Serverストアドプロシージャのreturn 数値はint型のみ渡せる
  4. 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から返された値)

まとめ

メソッド戻り値利用シーン
ExecuteReaderSqlDataReader(ストリーム複数行)複数レコードの取得
SqlDataAdapter.FillDataSet/DataTable(オフラインテーブル)WinFormコントロールへのテーブルバインド
ExecuteScalarobject(先頭行先頭列)単一の集計結果だけ必要な場合
ExecuteNonQueryint(影響行数)+ReturnValue戻り値追加/更新/削除、ストアドプロシージャからステータスコードを受け取る場合

ストアドプロシージャ Return

Previous:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です