2010-06-15 11 views
3

J'ai une base de données Access 2003 qui se connecte à une boîte SQL Server 2008 via ODBC. Les tables de SQL Server sont connectées en tant que tables liées dans Access. J'ai une procédure stockée sur le serveur SQL que j'essaye d'exécuter via le code ADO. Le problème que j'ai est que Access ne peut pas sembler trouver la procédure. Que dois-je faire dans Access pour pouvoir exécuter cette procédure stockée? Quelques faits ...Comment exécuter une procédure stockée à partir d'Access à l'aide de tables liées

La procédure stockée en question accepte un paramètre qui est un nombre entier. La procédure stockée renvoie un jeu d'enregistrements que j'espère utiliser comme source de données pour un contrôle ListBox.

Voici mon code ADO dans Access ...

Private Sub LoadUserCaseList(userID As Integer) 

    Dim cmd As ADODB.Command 

    Set cmd = New ADODB.Command 
    cmd.ActiveConnection = CurrentProject.Connection 
    cmd.CommandType = adCmdStoredProc 
    cmd.CommandText = "uspGetUserCaseSummaryList" 

    Dim par As New ADODB.Parameter 
    Set par = cmd.CreateParameter("userID", adInteger) 
    cmd.Parameters.Append par 
    cmd.Parameters("userID") = userID 

    Dim rs As ADODB.Recordset 
    Set rs = cmd.Execute() 
    lstUserCases.Recordset = rs 

End Sub 

L'erreur que je reçois est « le moteur de base de données Microsoft Jet ne peut pas trouver la table d'entrée ou de la requête "uspGetUserCaseSummaryList".

Répondre

6

CurrentProject.Connection est la connexion à votre base de données Access Vous pouvez vérifier que en faisant cela dans la fenêtre immédiate.

Debug.Print CurrentProject.Connection 

Vous devez créer un nouvel objet ADODB.Connection w avec une chaîne de connexion qui pointe vers votre instance SQL Server. Avoir votre objet ADODB.Command utiliser cette connexion.

Modifier: Vous pouvez supprimer l'objet ADODB.Command et utiliser la méthode Execute de la connexion pour renvoyer des enregistrements de votre procédure stockée. Cet exemple utilise une procédure stockée qui attend 3 paramètres.

Private Sub GetCenterCodes() 
    Dim cnn As ADODB.Connection 
    Dim rs As ADODB.Recordset 

    Set cnn = New ADODB.Connection 
    cnn.ConnectionString = "Provider=SQLOLEDB;Data Source=VM2003\sqlexpress;" _ 
     & "User ID=foo;Password=bar;Initial Catalog=Inventory" 
    cnn.Open 
    Set rs = New ADODB.Recordset 
    Set rs = cnn.Execute("EXEC uspGetCenterCodes 14, 14, 501") 
    Debug.Print rs(0), rs(1), rs(2) 
    rs.Close 
    Set rs = Nothing 
    cnn.Close 
    Set cnn = Nothing 
End Sub 

Vous pouvez trouver un exemple de chaîne de connexion qui correspond à vos besoins à ConnectionStrings.com

+0

Excellente réponse! Merci beaucoup. Une question. Comment suggéreriez-vous de stocker les informations de chaîne de connexion sur le serveur SQL afin que les modifications ne doivent être effectuées qu'au même endroit? Une chose que j'aime à propos des tables liées est que j'ai une macro nommée "Refresh Connection" qui appelle un sous-programme qui réinitialise les informations de connexion ODBC pour toutes les tables (basculer entre les environnements de test et de production). Ce serait génial si je pouvais faire la même chose pour les informations de connexion ADO sans que les utilisateurs entrent dans le code. – webworm

+1

En supposant que vous possédez des propriétés de connexion stockées dans une table, vous pouvez créer des enregistrements distincts pour les propriétés de connexion test et prod. Avoir votre macro Refresh Connection marquer l'enregistrement approprié comme actif. Créez ensuite une fonction, GetConnectionString, qui lit l'enregistrement de connexion active et construit votre chaîne de connexion. Ensuite, le code ci-dessus pourrait être changé en cnn.ConnectionString = GetConnectionString. BTW, vous pouvez préférer utiliser une connexion de confiance afin que vous puissiez éviter de traiter avec ID utilisateur et mot de passe. – HansUp

+0

Merci encore. Excellente solution – webworm