VB .NETのADO.NETからDB2上のストアドプロシージャを呼び出す方法です。
確認はVisual Studio 2013 Update 3とDB2 Express-C 9.7 for Linux(64bit)で行っています。
DB2/400に接続する場合は、”TEST”となっている箇所を”ライブラリ名.TEST”のように変更すれば動作すると思います。(ライブラリ名を省略した場合、AS/400の暗黙のスキーマというやつに引っかかるはずです。)
DB2のストアドプロシージャは、入力パラメータ(IN_PARA)で受け取った値を無視して、なんらかの値をパラメータ(OUT_PARA)に格納するだけの非常に単純なもの。
CREATE OR REPLACE PROCEDURE TEST(IN IN_PARA VARCHAR(10), OUT OUT_PARA B VARCHAR(10)) BEGIN SET OUT_PARA = '1234567890'; END
Dim Cmd As OleDb.OleDbCommand = <DB2へのコネクション>.CreateCommand() With Cmd .CommandType = CommandType.StoredProcedure .CommandText = "TEST" ' ストアドプロシージャTESTを呼び出す .Parameters.Add("IN_PARA", OleDb.OleDbType.Char).Value = "1234" Dim OutPara As OleDb.OleDbParameter = New OleDb.OleDbParameter("OUT_PARA", OleDb.OleDbType.Char, 10) OutPara.Direction = ParameterDirection.Output .Parameters.Add(OutPara) .ExecuteNonQuery() Debug.Print("戻り値=" & Cmd.Parameters("OUT_PARA").Value) End With
Dim Cmd As OleDb.OleDbCommand = <DB2へのコネクション>.CreateCommand() With Cmd .CommandType = CommandType.Text .CommandText = "{CALL TEST(?,?)}" ' ストアドプロシージャTESTを呼び出す .Parameters.Add("IN_PARA", OleDb.OleDbType.Char).Value = "1234" Dim OutPara As OleDb.OleDbParameter = New OleDb.OleDbParameter("OUT_PARA", OleDb.OleDbType.Char, 10) OutPara.Direction = ParameterDirection.Output .Parameters.Add(OutPara) .ExecuteNonQuery() Debug.Print("戻り値=" & Cmd.Parameters("OUT_PARA").Value) End With
Directionプロパティに、ParameterDirection.InputまたはParameterDirection.InputOutputを設定したパラメータに対し、Valueプロパティへ有効な値を設定せずにクエリを実行するとSystem.Data.OleDb.OleDbExceptionが発生します。
System.Data.OleDb.OleDbException (0x80004005): CLI0100E パラメーターの数が正しくありません。 SQLSTATE=07001
また、Directionプロパティに、ParameterDirection.OutputまたはParameterDirection.InputOutputを設定したパラメータに対し、Sizeプロパティへ有効な値を設定せずにクエリを実行するとSystem.InvalidOperationExceptionが発生します。
System.InvalidOperationException: ‘String[1]: Size プロパティのサイズが 0 です。これは無効です。