web-dev-qa-db-fra.com

Appel d'une procédure stockée à l'aide de VBA

Je travaille dans le front-end utilisateur d'Access 2010 avec un back-end Microsoft SQL Server 2008.

Les tables dans Access sont toutes liées à la base de données du serveur SQL.

J'ai une procédure stockée qui insère de nouvelles valeurs (fournies par les paramètres) dans une table.

J'ai posé une question similaire précédemment et obtenu une bonne réponse Appel de la procédure stockée lors du passage des paramètres du module d'accès dans VBA

Je ne sais pas comment trouver les informations nécessaires pour établir une chaîne de connexion (ex: je ne connais pas le fournisseur/nom du serveur/adresse du serveur).

J'ai trouvé une question ici qui disait "Si vous avez déjà une table liée Access pointant vers la base de données SQL Server, vous pouvez simplement utiliser sa chaîne .Connect Avec un objet DAO.QueryDef pour exécuter la procédure stockée" - - Chaîne de connexion pour Access pour appeler la procédure stockée SQL Server

J'ai essayé d'implémenter ce code. Pour passer des paramètres, j'ai essayé d'utiliser un exemple précédent.

J'ai l'erreur

échec de l'appel

à la ligne Set rst = qdf.OpenRecordset(dbOpenSnapshot) (sans parler de mon code de paramètres de passage est probablement loin).

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

Quelqu'un pourrait-il me dire ce qui pourrait ne pas fonctionner avec mon code et pourquoi j'obtiens cette erreur?

12
VictoriaJay

Victoria,

Vous pouvez exécuter une procédure stockée à l'aide d'ADO, comme ci-dessous ...

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

Pour obtenir votre chaîne de connexion, vous pouvez utiliser la ligne

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

dans la fenêtre Exécution et cela devrait vous montrer une chaîne de connexion que vous pouvez utiliser.

Pourriez-vous essayer cela et me faire savoir si vous avez des problèmes.

Cendre

14
The Dumb Radish

Peut également formuler un appel de proc stocké qui renvoie un jeu de résultats sous la forme d'une instruction select.

Selon cet exemple:

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