web-dev-qa-db-ja.com

VBAを使用してストアドプロシージャを呼び出す

Access 2010ユーザーフロントエンドとMicrosoft SQL Server 2008バックエンドを使用しています。

AccessのテーブルはすべてSQLサーバーデータベースにリンクされています。

(パラメーターによって提供される)新しい値をテーブルに挿入するストアドプロシージャがあります。

私は以前に同様の質問をして、良い答えを得ました VBAのアクセスモジュールからパラメーターを渡すときにストアドプロシージャを呼び出す

接続文字列を作成するために必要な情報を見つける方法がわかりません(例:プロバイダー/サーバー名/サーバーアドレスがわかりません)。

「SQL Serverデータベースを指すAccessリンクテーブルが既にある場合、DAO.QueryDefオブジェクトでその_.Connect_文字列を使用して、ストアドプロシージャを実行できます」-- Access for SQL Serverストアドプロシージャを呼び出すための接続文字列

私はこのコードを実装しようとしました。パラメータを渡すために、前の例を使用してみました。

エラーが発生しました

呼び出しに失敗しました

Set rst = qdf.OpenRecordset(dbOpenSnapshot)の行(私のパラメーターの渡しは言うまでもなく、コードはおそらくかなりずれています)。

_Set qdf = CurrentDb.CreateQueryDef("")
qdf.Connect = CurrentDb.TableDefs("tblInstrumentInterfaceLog").Connect
qdf.sql = "EXEC dbo.upInsertToInstrumentInterfaceLog"
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset(dbOpenSnapshot)

qdf.Parameters.Append qdf.CreateParameter("@BatchID", adVarChar, adParamInput, 60, BatchID)
qdf.Parameters.Append qdf.CreateParameter("@InstrumentName", adVarChar, adParamInput, 60, InstrumentName)
qdf.Parameters.Append qdf.CreateParameter("@FileName", adVarChar, adParamInput, 60, FileName)
qdf.Parameters.Append qdf.CreateParameter("@QueueId", adVarChar, adParamInput, 60, QuenueId)

rst.Close
Set rst = Nothing
Set qdf = Nothing
_

誰かが私のコードの何が問題になっているのか、なぜこのエラーが発生するのかを教えてもらえますか?

12
VictoriaJay

ビクトリア、

以下のように、ADOを使用してストアドプロシージャを実行できます...

Set mobjConn = New ADODB.Connection
mobjConn.Open "your connection string"
Set mobjCmd = New ADODB.Command
With mobjCmd
    .ActiveConnection = Me.Connection
    .CommandText = "your stored procedure"
    .CommandType = adCmdStoredProc
    .CommandTimeout = 0
    .Parameters.Append .CreateParameter("your parameter name", adInteger, adParamInput, , your parameter value)
    ' repeat as many times as you have parameters

    .Execute
End With

接続文字列を取得するには、次の行を使用できます

Debug.Print CurrentDb.TableDefs("tblInstrumentInterfaceLog").Connect

イミディエイトウィンドウに表示され、使用できる接続文字列が表示されます。

試してみて、何か問題があれば教えてください。

14
The Dumb Radish

Selectステートメントとして結果セットを返すストアドプロシージャコールを作成することもできます。

この例のように:

Sub Macro2()


'
' Macro1 Macro
'
    'Declare variables'
        Dim mySql As String
        Set objMyConn = New ADODB.Connection
        objMyConn.CommandTimeout = 0
        Set objMyCmd = New ADODB.Command
        objMyCmd.CommandTimeout = 0
        Set objMyRecordset = New ADODB.Recordset
        objMyConn.ConnectionString = CStr(Range("ADOConnectString").Value)
        objMyConn.Open
        Set objMyRecordset.ActiveConnection = objMyConn
        Set objMyCmd.ActiveConnection = objMyConn


   ' call dbo.TotalLHCLoadingRate  Range("TotalLHCLoadingRate")

        mySql = "select dbo.TotalLHCLoadingRate ( " _
    + CStr(Range("MemberNo").Value) _
    + ", getdate() ) "
        MsgBox "TotalLHCLoadingRate SQL : " + mySql
        objMyCmd.CommandText = mySql
        objMyCmd.CommandType = adCmdText
        objMyCmd.Execute
        objMyRecordset.Open objMyCmd
        Range("TotalLHCLoadingRate ").Value = ""
        Range("TotalLHCLoadingRate ").CopyFromRecordset (objMyRecordset)
        Range("TotalLHCLoadingRate ").Interior.ColorIndex = 37
        MsgBox "TotalLHCLoadingRate  : " + CStr(Range("TotalLHCLoadingRate ").Value)
        objMyRecordset.Close
End Sub
0
Allan F