前回は引数なしのストアドプロシージャをVB.NETから呼び出す方法を紹介しました。
今回は、引数があるストアドプロシージャをVB.NETから呼び出す方法を紹介します。
開発言語:VB.NET 2005
使用するテーブルは、Oracleを使用している人であればおなじみの、scott/tigerのEMP表です。
ストアドプロシージャは下記の通りです。もらった引数をINSERT文で書き込んでいるだけのものです。
(例によって深い意味はありません。説明用です。)
■ストアドプロシージャ2
CREATE OR REPLACE PROCEDURE SCOTT.PROCEDURE2(in_EMPNO in varchar2, in_ENAME in varchar2, in_SAL in number)
IS
BEGIN
INSERT INTO EMP (EMPNO, ENAME, SAL) VALUES (in_EMPNO, in_ENAME, in_SAL);
END;
/
以下、ODP.NET, MicorosoftのOracleClient, OleDB の3種類を使用してPROCEDURE2を呼び出す例です。
使用方法は、見ていただければわかる通りほぼ一緒です。
違う箇所と言えば、ストアドプロシージャの引数に渡す値の設定の仕方です。
OracleのVarchar2に対して
ODP.NETではOracleDbType.Varchar2を
OracleClientではOracleType.VarCharを
OleDbではOleDbType.VarCharを指定します。
OracleのNumberに対しては
ODP.NETではOracleDbType.Decimalを
OracleClientではOracleType.Numberを
OleDbではOleDbType.Decimalを指定します。
それとCmd.Parameters.Addの第1引数ですが、ストアドプロシージャの引数名と合わせておいた方が良いようです。
(OracleClientでは合わせておかないとうまく呼び出すことができませんでした)
■ODP.NETサンプル
Private Sub ODP_TEST2()
Try
Using OraConn As New OracleConnection("user id=scott;password=tiger;data source=YourServer")
Using Cmd As New OracleCommand
OraConn.Open()
Cmd.Connection = OraConn
Cmd.CommandType = CommandType.StoredProcedure
Cmd.CommandText = "PROCEDURE2"
Cmd.Parameters.Add("in_EMPNO", OracleDbType.Varchar2).Value = "7777"
Cmd.Parameters.Add("in_ENAME", OracleDbType.Varchar2).Value = "HIRO"
Cmd.Parameters.Add("in_SAL", OracleDbType.Decimal).Value = 500
Cmd.ExecuteNonQuery()
MessageBox.Show("PROCEDURE2 正常終了", "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Using
End Using
Catch OraEx As OracleException
MessageBox.Show(OraEx.Message, "ORACLE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Catch ex As Exception
MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
End Try
End Sub
■OracleClientサンプル
Private Sub OracleClient_TEST2()
Dim builder As New System.Data.OracleClient.OracleConnectionStringBuilder
With builder
.DataSource = "YourServer"
.UserID = "scott"
.Password = "tiger"
End With
Try
Using OraConn As New OracleConnection(builder.ConnectionString)
Using Cmd As New OracleCommand
OraConn.Open()
Cmd.Connection = OraConn
Cmd.CommandType = CommandType.StoredProcedure
Cmd.CommandText = "PROCEDURE2"
Cmd.Parameters.Add("in_EMPNO", OracleType.VarChar).Value = "7777"
Cmd.Parameters.Add("in_ENAME", OracleType.VarChar).Value = "HIRO"
Cmd.Parameters.Add("in_SAL", OracleType.Number).Value = 500
Cmd.ExecuteNonQuery()
MessageBox.Show("PROCEDURE2 正常終了", "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Using
End Using
Catch OraEx As OracleException
MessageBox.Show(OraEx.Message, "ORACLE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Catch ex As Exception
MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
End Try
End Sub
■OleDBサンプル
Private Sub OleDB_TEST2()
Try
Using OraConn As New OleDbConnection("Provider=MSDAORA.1.Oracle;user id=scott;password=tiger;data source=YourServer")
Using Cmd As New OleDbCommand
OraConn.Open()
Cmd.Connection = OraConn
Cmd.CommandType = CommandType.StoredProcedure
Cmd.CommandText = "PROCEDURE2"
Cmd.Parameters.Add("in_EMPNO", OleDbType.VarChar).Value = "7777"
Cmd.Parameters.Add("in_ENAME", OleDbType.VarChar).Value = "HIRO"
Cmd.Parameters.Add("in_SAL", OleDbType.Decimal).Value = 500
Cmd.ExecuteNonQuery()
MessageBox.Show("PROCEDURE2 正常終了", "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Using
End Using
Catch OleEx As OleDbException
MessageBox.Show(OleEx.Message, "OleDB ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Catch ex As Exception
MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
End Try
End Sub