C#でODBCを使ってSQL-Serverのストアドを実行する方法

IT

はじめに

通常は、SQL-Serverに繋ぐ場合、SQLClientを使用しますが、今回はもっと汎用的なODBCを使っての繋ぎ方を紹介したいと思います。
私は特に、引数の渡し方法、戻り値の受け取り方法、リターンコードの受け取り方法で、数日つまずいたので、解決方法を共有したいと思います。

プログラムで解説

さっそくサンプルプログラムをどうぞ。

サンプル1

指定された会員のデータを取得するだけの簡単なストアドを呼ぶ場合です。

using (var con = new OdbcConnection(ODBC_CONNEXT_STRING))
{
    con.Open();

    var cmd = new OdbcCommand("{?=call GetCustomerDatas(?)}", con);
    cmd.CommandType = CommandType.StoredProcedure;

    var retval = cmd.Parameters.Add("@Out_RetCd", OdbcType.Int);
    retval.Direction = ParameterDirection.ReturnValue;

    var p1 = cmd.Parameters.Add("@In_MemNo", OdbcType.NVarChar);
    p1.Direction = ParameterDirection.Input;
    p1.Value = "00000001";

    OdbcDataAdapter adp = new OdbcDataAdapter(cmd);
    DataSet ds = new DataSet();
    adp.Fill(ds);
    dataGrid.DataContext = ds.Tables[0];

    con.Close();

    MessageBox.Show($"リターンコード:{retval.Value}");

}

プログラムのポイント

1.ストアドを呼ぶ場合は、下記の書式で書きます。

var cmd = new OdbcCommand("{?=call GetCustomerData(?)}", con);

リターンコードや引数を”?”で表現して定義します。

2.リターンコードは最初に登録する。

var retval = cmd.Parameters.Add("@Out_RetCd", OdbcType.Int);
retval.Direction = ParameterDirection.ReturnValue;

1で最初の?はリターンコードとなる為、必ず最初の定義はリターンコードにします。

サンプル2

指定された会員のデータを戻り値として取得するストアドを呼び出します。

using (var con = new OdbcConnection(ODBC_CONNEXT_STRING))
{

    con.Open();

    var cmd = new OdbcCommand("{?=call GetCustomerData(?,?,?)}", con);
    cmd.CommandType = CommandType.StoredProcedure;

    var retval = cmd.Parameters.Add("@Out_RetCd", OdbcType.Int);
    retval.Direction = ParameterDirection.ReturnValue;

    var p1 = cmd.Parameters.Add("@In_MemNo", OdbcType.NVarChar);
    p1.Direction = ParameterDirection.Input;
    p1.Value = "00000001";

    var p2 = cmd.Parameters.Add("@Out_NameSei", OdbcType.NVarChar);
    p2.Direction = ParameterDirection.InputOutput;
    p2.Size = 8;
    p2.Value = "";

    var p3 = cmd.Parameters.Add("@Out_LnBal", OdbcType.Decimal);
    p3.Direction = ParameterDirection.InputOutput;
    p3.Precision = 8;
    p3.Scale = 2;
    p3.Value = 0;

    var ret = cmd.ExecuteNonQuery();

    con.Close();

    MessageBox.Show($"リターンコード:{retval.Value}\n名前:{p2.Value}\n残高:{p3.Value}");

}

プログラムのポイント

1.戻り値の設定では、桁数をいれること、初期値を設定することが必要です。
ストアドの戻り値の設定どおりに、呼び出し側でも設定が必要です。

var p2 = cmd.Parameters.Add("@Out_NameSei", OdbcType.NVarChar);
p2.Direction = ParameterDirection.InputOutput;
p2.Size = 8;
p2.Value = "";

var p3 = cmd.Parameters.Add("@Out_LnBal", OdbcType.Decimal);
p3.Direction = ParameterDirection.InputOutput;
p3.Precision = 8;
p3.Scale = 2;
p3.Value = 0;

まとめ

いかがだったでしょうか?余りネットにも情報が無くて苦労しましたが、きちんと設定すれば問題なく動きます。
こういうエラーは原因を探るのがなかなか大変なので、皆様の役に立てばうれしいです。

コメント

タイトルとURLをコピーしました