J'ai un grand programme VB qui se connecte à la base de données Oracle.Pilote Microsoft ODBC pour Oracle Erreur de syntaxe ou violation d'accès (-2147217900)
strCn = "Driver={Microsoft ODBC for Oracle};" & _
"SERVER=PSPROD;"
Set Cn = New ADODB.Connection
Cn.ConnectionString = strCn
Cn.CursorLocation = adUseNone
Cn.Open
Il y a beaucoup d'utilisateurs de mon programme j'ai donc une table qui contient chaque nom de connexion de l'utilisateur et leurs droits d'accès aux différentes tables. Je crée un jeu d'enregistrements de tous les utilisateurs lorsque le programme est démarré, puis sélectionnez USERNAME et GRANTED_ROLE à partir du jeu d'enregistrements où USERNAME et PASSWORD sont trouvés. J'utilise une instruction "Définir le rôle 'GRANTED_ROLE' identifiée par 'mot de passe'" et l'instruction Cn.Execute pour configurer les droits d'accès de l'utilisateur. Tout est fait dans un module.
Dans un formulaire, je souhaite appeler une procédure stockée qui va SELECT, INSERT et mettre à jour les informations dans les tables d'un autre schéma. Je suis en mesure d'appeler et exécuter la procédure stockée lorsque je crée une nouvelle connexion à la base de données avec ce code:
Dim cmd5040 Comme ADODB.Command Dim conn5040 Comme ADODB.Connection Dim param5040 Comme ADODB.Parameter
Set conn5040 = Nouvelle ADODB.Connection conn5040 = "Pilote = {Microsoft ODBC pour Oracle};" & _ "SERVEUR = PSPROD; UID = XXXXXXX; PWD = XXXXXXXX" conn5040.Open
Set cmd5040 = New ADODB.Command
Avec cmd5040 .ActiveConnection = conn5040 .CommandType = adCmdStoredProc .CommandText = "S4115040_IMPORT_NEWBIDITEMSPES.S4115040_CheckTime"
.Parameters.Append .CreateParameter(, adInteger, adParamInputOutput, 5)
.Parameters.Append .CreateParameter(, adVarChar, adParamInputOutput, 400)
End With
cmd5040 (0) = 0 cmd5040 (1) = "" cmd5040.CommandTimeout = 300
cmd5040.Execute conn5040.Close
Cependant, je reçois le message d'erreur « -2147217900 [Microsoft] [ Pilote ODCB pour Oracle] Erreur de syntaxe ou violation d'accès "lorsque j'utilise la même connexion ('Cn') au démarrage du programme. Mon code est:
Dim cmd5040 Comme ADODB.Command Dim param5040 Comme ADODB.Parameter
Set cmd5040 = New ADODB.Command
Avec cmd5040 .ActiveConnection = .CommandType = Cn adCmdStoredProc . CommandText = "S4115040_IMPORT_NEWBIDITEMSPES.S4115040_CheckTime"
.Parameters.Append .CreateParameter(, adInteger, adParamInputOutput, 5)
.Parameters.Append .CreateParameter(, adVarChar, adParamInputOutput, 400)
End With
cmd5040 (0) = 0 cmd5040 (1) = ""
cmd5040.Execute
Je travaille avec mon DBA. Elle m'a donné des subventions directes et des privliges d'exécution directe et je reçois toujours le message d'erreur.
Qu'est-ce que je fais mal? Dois-je être en mesure d'utiliser la connexion d'origine pour exécuter une procédure stockée? Ou dois-je créer une deuxième connexion?
La connexion est déclarée comme Cn public Juste avant d'appeler la procédure stockée que j'ai vérifié l'état de Cn et il est ouvert. – Jan
Modifié la réponse - les chaînes de connexion pour les deux connexions sont différentes et cela peut être le problème. – barrowc
Vous avez raison. Cn fait sa connexion comment dans un processus en deux étapes recherchant le nom d'utilisateur et leurs rôles pour accorder des privilèges aux tables. La deuxième connexion établit la connexion directe dans un processus en utilisant un nom d'utilisateur «générique» plutôt que le nom d'utilisateur du particulier. Boss a consenti à utiliser la deuxième connexion. L'utilisation de la deuxième connexion ne sera pas fréquente et la durée de l'ouverture sera très courte. Merci pour votre attention à ma question !! – Jan