はじめに
通常は、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;
まとめ
いかがだったでしょうか?余りネットにも情報が無くて苦労しましたが、きちんと設定すれば問題なく動きます。
こういうエラーは原因を探るのがなかなか大変なので、皆様の役に立てばうれしいです。
コメント