VB.NETでADOでOracleのストアドを起動
いつも楽しく勉強させていただいております。
環境はWindows Server 2008R2 DataCenter、データベースはOracle10G、開発ツールはVB.NET2015です。
このたびWindows Server 2003のVB6.0から上記の環境に乗せ換えているところです(Oracleのバージョンは変わりなし)。
最初にVB6.0からVB.NETへの変換はかけましたが、
なるべくVBのソースは変更しないという制約があります(テストのし直しが膨大になるので)。
VBとOracleはADOを使って接続しています。
ADOを使ってテーブルの読み書きはできるのですが、ストアドプロシージャの起動がうまくいきません。
具体的には入力パラメータはストアドに渡って処理も動くのですが、出力パラメータが返ってきません。
ストアドが正しく動くことはObjectBrowserで確認済みです。
下記のソースはVB6.0で動いていたものですが、VB.NET2015では二つの出力パラメータの値がNothingとなります。
(本来ならステータスとメッセージが返ります)。
VB.NET2015でADOでストアドを使うことは無理なのでしょうか。
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim Cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim Prm As New ADODB.Parameter
Dim strMsg As String
On Error GoTo Err_cmdExec_Click
With Cnn
.Provider = "MSDASQL"
.ConnectionString = "DSN=DB1;" &
"UID=abc;" &
"PWD=efg"
.Open()
End With
'ストアドプロシージャ呼び出し設定&呼び出し
With cmd
.CommandTimeout = 0 'タイムアウト設定を無制限に
.ActiveConnection = Cnn 'サーバー接続設定
.CommandText = "CHECK_PROC" 'ストアド名セット
.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc 'ストアドなのでadCmdStoredProc
Prm = .CreateParameter("p_yyyymm", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 6, "201601")
cmd.Parameters.Append(Prm)
Prm = .CreateParameter("p_sts", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamOutput, 1)
cmd.Parameters.Append(Prm)
Prm = .CreateParameter("p_msg", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamOutput, 512)
cmd.Parameters.Append(Prm)
'実行
.Execute()
'戻り値の判断&表示用メッセージ生成
If .Parameters.Item("p_sts").Value = "0" Then
strMsg = "正常終了しました"
Else
strMsg = "異常終了しました" & vbCrLf &
"ErrMsg=" & .Parameters.Item("p_msg").Value
End If
End With
Exit_cmdExec_Click:
'接続解除
Cnn.Close()
'Set Cnn = Nothing
'メッセージ表示
MsgBox(strMsg)
Exit Sub
Err_cmdExec_Click:
'ストアド以外の場所でのエラーなので、VBのErrの情報セット
strMsg = "異常終了しました" & vbCrLf &
"ErrNO=" & Err.Number & " ErrMsg=" & Err.Description
Resume Exit_cmdExec_Click
End Sub
補足
DB名を記述に加えたら、上手くストアドプロシージャへ進めたんですが、新たなエラーが出てしまって、困ってます。 そのストアドプロシージャの中身って言うのが、 CREATE PROCEDURE [Test_pro] @a int,@b varchar(10) output AS begin if Len(@a)>0 select @b='Found!'; else select @b='Not Found!'; end なんですが、 Microsoft OLE DB Provider for SQL Server エラー '80040e10' プロシージャ 'Test_Pro' にはパラメータ '@b' を指定してください。 というエラーが出てしまうんです。 一体、どこがマズいんでしょ???