※ ChatGPTを利用し、要約された質問です(原文:VB.NETでADOでOracleのストアドを起動)
VB.NETでADOでOracleのストアドを起動
このQ&Aのポイント
VB.NETでADOを使ってOracleのストアドプロシージャを起動する方法について教えてください。
VB.NET2015でADOを使ってOracleのストアドプロシージャを起動する際に、出力パラメータの値が返ってこない現象が発生しています。解決方法を教えてください。
VB6.0からVB.NET2015に移行した際、ストアドプロシージャの起動で出力パラメータの値が返ってこない問題が発生しています。この問題を解決する方法を教えてください。
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
お礼
kawais070さん、回答ありがとうございます。 Oracle in OraClient10g_home1というのを使っています。 ODBCの設定画面にMicrosoft ODBC for Oracleというのは見当たらないのでインストールが必要ですよね。 ちょっと試してみます。
補足
https://msdn.microsoft.com/ja-jp/data/gg607261.aspxによれば、 ODBC ドライバーや OLE DB プロバイダーを使用するアプリケーションを Oracle 9i 以降の 環境で使用する場合、または 64 ビットで動作させる場合には、 オラクル社提供の ODBC ドライバー、もしくは、OLE DB プロバイダーをご利用ください。 とあるのですが、今回はOracleは10GでOSも64ビットなので無理みたいです・・・。