VB .NETからDB2のストアドプロシージャを呼び出す

土曜日 , 20, 9月 2014 Leave a comment

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
  • CommandTypeプロパティにCommandType.StoredProcedureを指定して呼び出す場合
        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
  • CommandTypeプロパティにCommandType.Textを指定して呼び出す場合
        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 です。これは無効です。

Tags:, , ,