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