IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Création objet ODBC en VBA


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 77
    Par défaut Création objet ODBC en VBA
    Bonjour

    J'essaie de créer un objet ODBC via VBA pour m'affranchir complètement du poste sur lequel je me trouve en vue d'exécuter des requêtes directes SQL sur une base distante AS400.
    J'ai trouvé quelques tutos ou posts à ce sujet, et j'essaie de faire une synthèse de tout çà en trouvant un code qui marche.

    il y a ce tuto dans la FAQ : çà fonctionne pour une base ACCESS, mais pas pour ma base AS400 distante. Voici mon code (la chaîne StrAttributes a été testée avec ce code, et avec les ';' à la place des ' ') :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub OBCD()
        '---- Créer un DSN ---------
        Dim strDriver As String
        Dim strAttributes As String
        Dim intRet As Long
     
        strDriver = "Client Access ODBC Driver (32-bit)" & Chr$(0)
        strAttributes = "DSN=ODBCKPI" & Chr$(0)
        strAttributes = strAttributes & "DESCRIPTION=Test DSN par VB6" & Chr$(0)
     
        strAttributes = strAttributes & "UID=BAUDP System=LV011BK DATABASE=FGE50C3 SIGNON=1 DBQ=FGE50C3 DFTPKGLIB=FGE50C3 PKG=FGE50C3/DEFAULT(IBM),2,0,1,0,512"
        intRet = SQLConfigDataSource(vbNull, 1, strDriver, strAttributes)
        If intRet Then
            MsgBox "DSN Created"
        Else
            MsgBox "Create Failed"
        End If
     
    End Sub
    D'autre part, pour une base ACCESS, çà me crée un user DSN et je préfèrerait un DSN système (et au passage comment on fait un file DSN ?)

    Voici une autre solution (qui marche), qui me crée une connexion, mais pas un DSN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub essai()
        Dim db As Database
        Dim WrkSpaceODBC As DAO.Workspace, ConnectODBC As DAO.Connection, r2 As DAO.Recordset
        Dim strODBC As String, ErrDesc As String
        Dim qdf As DAO.QueryDef
       Set WrkSpaceODBC = DBEngine.CreateWorkspace("ODBC", "Admin", "", dbUseODBC)
       Set ConnectODBC = WrkSpaceODBC.OpenConnection("", dbDriverNoPrompt, True, "ODBC;DRIVER={Client Access ODBC Driver (32-bit)};UID=BAUDP;System=LV011BK;DATABASE=FGE50C3;SIGNON=1;DBQ=FGE50C3;DFTPKGLIB=FGE50C3;PKG=FGE50C3/DEFAULT(IBM),2,0,1,0,512;")
        ConnectODBC.QueryTimeout = 900
    End Sub
    Comment utiliser cette connexion pour paramétrer un objet QueryDef ? L'argument Name doit rester chaîne vide sinon çà plante.
    Cette dernière solution est la plus proche de ce que je voudrait faire : la connexion est initialisée, et quand je mets lun paramètre errroné, çà m'ouvre la fenêtre ODBC. Mais comment l'enregistrer en tant que DSN ?

    Je sens que çà chauffe, mais j'ai besoin de votre aide pour finaliser complètement ce code.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,

    Ton premier code (faq) s'appuie sur l'API ODBC.
    La faq ne mentionne que les constantes relatives à un DSN utilisateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Const ODBC_ADD_DSN = 1 
    Private Const ODBC_CONFIG_DSN = 2 
    Private Const ODBC_REMOVE_DSN = 3
    Pour un DSN Système :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Const ODBC_ADD_SYS_DSN As Long = 4      ' Ajoute DSN système
    Private Const ODBC_CONFIG_SYS_DSN As Long = 5   ' Configure DSN système
    Private Const ODBC_REMOVE_SYS_DSN As Long = 6   ' Supprime DSN système
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        intRet = SQLConfigDataSource(vbNull, ODBC_ADD_SYS_DSN, strDriver, strAttributes)
    Avec SQLConfigDataSource de l'API ODBC, les attributs sont séparés par le caractère nul (vbNullChar ou Chr(0)).
    De plus, la chaîne d'attributs doit se terminer par deux caractères nul.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        strAttributes = "DSN=ODBCKPI" & Chr$(0)
        strAttributes = strAttributes & "DESCRIPTION=Test DSN par VB6" & Chr$(0)    
        strAttributes = strAttributes & "UID=BAUDP" & Chr$(0)
        strAttributes = strAttributes & "System=LV011BK" & Chr$(0)
        strAttributes = strAttributes & "DATABASE=FGE50C3" & Chr$(0)
        strAttributes = strAttributes & "SIGNON=1" & Chr$(0)
        strAttributes = strAttributes & "DBQ=FGE50C3" & Chr$(0)
        strAttributes = strAttributes & "DFTPKGLIB=FGE50C3" & Chr$(0)
        strAttributes = strAttributes & "PKG=FGE50C3/DEFAULT(IBM),2,0,1,0,512" & Chr$(0)
        strAttributes = strAttributes & Chr$(0)
    au passage comment on fait un file DSN
    Pour créer un fichier DSN il faut utiliser la fonction SQLWriteFileDSN de l'API ODBC.


    Voici un exemple de création d'objet requête SQL-Direct en VBA+DAO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Dim db As DAO.Database, qd As DAO.QueryDef
    Dim strNomRequete As String
    Dim strODBCconn As String, strSQL As String
     
    ' Nom de la requête SQL-Direct à créer ou modifier
    strNomRequete = "mysqlFournisseurs"
    ' Chaîne de connexion ODBC avec DSN, pour requête SQL-Direct
    strODBCconn = "ODBC;DSN=Mon DSN MySQL;UID=su;PWD=123456"
    ' code SQL de la requête
    strSQL = "select * from fournisseurs"
     
    Set db = CurrentDb
    ' Référence ou crée une requête
    On Error Resume Next
    Set qd = db.QueryDefs(strNomRequete)
    On Error GoTo 0
    If qd Is Nothing Then Set qd = db.CreateQueryDef(strNomRequete)
    ' SQL de la requête
    qd.SQL = strSQL
    ' Chaîne de connexion ODBC pour requête SQL-Direct
    qd.Connect = strODBCconn
    ' libère les objets
    Set qd = Nothing
    Set db = Nothing
    Si on ne souhaite pas utiliser de DSN, la chaîne de connexion doit inclure le nom du pilote ODBC, plus d'autres attributs (dépend du pilote).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Chaîne de connexion ODBC sans DSN, pour requête SQL-Direct
    strODBCconn = "ODBC;Driver=MySQL ODBC 3.51 Driver;SERVER=MDM;DATABASE=test;UID=su;PWD=123456"
    Concernant l'argument Name de OpenConnection.
    Si l'argument Connect ne contient pas l'attribut DSN=xxxx, Name doit être le nom d'un DSN valide ou rien.
    Si l'argument Connect contient l'attribut DSN=xxxx,je crois que Name peut être n'importe quoi.

    A+

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 77
    Par défaut
    Merci pour cette réponse claire, nette et précise.

    cependant, j'ai exécuté ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub OBCD()
        '---- Créer un DSN ---------
        Dim strDriver As String
        Dim strAttributes As String
        Dim intRet As Long
     
        strDriver = "Client Access ODBC Driver (32-bit)" & Chr$(0)
        strAttributes = "DSN=ODBCKPI" & Chr$(0)
        strAttributes = strAttributes & "DESCRIPTION=Test DSN" & Chr$(0)
        strAttributes = strAttributes & "UID=BAUDP" & Chr$(0)
        strAttributes = strAttributes & "System=LV011BK" & Chr$(0)
        strAttributes = strAttributes & "DATABASE=FGE50C3" & Chr$(0)
        strAttributes = strAttributes & "SIGNON=1" & Chr$(0)
        strAttributes = strAttributes & "DBQ=FGE50C3" & Chr$(0)
        strAttributes = strAttributes & "DFTPKGLIB=FGE50C3" & Chr$(0)
        strAttributes = strAttributes & "PKG=FGE50C3/DEFAULT(IBM),2,0,1,0,512" & Chr$(0)
        strAttributes = strAttributes & Chr$(0)
        intRet = SQLConfigDataSource(vbNull, 4, strDriver, strAttributes)
        If intRet Then
            MsgBox "DSN Created"
        Else
            MsgBox "Create Failed"
        End If
     
    End Sub
    sans succès, alors que ce code fonctionne pour le paramétrage d'un objet ODBC :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub essai()
        Dim db As Database
        Dim WrkSpaceODBC As DAO.Workspace, ConnectODBC As DAO.Connection, r2 As DAO.Recordset
        Dim strODBC As String, ErrDesc As String
        Dim qdf As DAO.QueryDef
       Set WrkSpaceODBC = DBEngine.CreateWorkspace("ODBC", "Admin", "", dbUseODBC)
       Set ConnectODBC = WrkSpaceODBC.OpenConnection("tagadatsointsoin", dbDriverPrompt, False, "ODBC;DRIVER={Client Access ODBC Driver (32-bit)};UID=BAUDP;System=LV011BK;DATABASE=FGE50C3;SIGNON=1;DBQ=FGE50C3;DFTPKGLIB=FGE50C3;PKG=FGE50C3/DEFAULT(IBM),2,0,1,0,512;")
        ConnectODBC.QueryTimeout = 900
    End
    J'aimerais bien réussir à en créer un : si je mets mon appli sur un serveur sur lequel je n'ai pas la main, je suis perdu !

  4. #4
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Je réalise que ( ) , sont des caractère interdits.
    Essaie en replaçant cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        strAttributes = strAttributes & "PKG=FGE50C3/DEFAULT(IBM),2,0,1,0,512" & Chr$(0)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        strAttributes = strAttributes & "PKG={FGE50C3/DEFAULT(IBM),2,0,1,0,512}" & Chr$(0)
    c'est à dire en utilisant la syntaxe mot-clé={valeur} au lieu de mot-clé=valeur.

    A+

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 77
    Par défaut
    Salut

    J'ai essayé avec les accolades {}, mais j'ai toujours le message "dsn failed !"

    code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Private Sub OBCD()
        '---- Créer un DSN ---------
        Dim strDriver As String
        Dim strAttributes As String
        Dim intRet As Long
     
     
        strDriver = "{Client Access ODBC Driver (32-bit)}" & Chr$(0)
        strAttributes = "DSN=ODBCKPI" & Chr$(0)
    DATABASE=FGE50C3 SIGNON=1 DBQ=FGE50C3 DFTPKGLIB=FGE50C3 PKG=FGE50C3/DEFAULT(IBM),2,0,1,0,512"
     
        strAttributes = strAttributes & "DESCRIPTION=Test DSN" & Chr$(0)
        strAttributes = strAttributes & "UID=BAUDP" & Chr$(0)
        strAttributes = strAttributes & "System=LV011BK" & Chr$(0)
        strAttributes = strAttributes & "DATABASE=FGE50C3" & Chr$(0)
        strAttributes = strAttributes & "SIGNON=1" & Chr$(0)
        strAttributes = strAttributes & "DBQ=FGE50C3" & Chr$(0)
        strAttributes = strAttributes & "DFTPKGLIB=FGE50C3" & Chr$(0)
        strAttributes = strAttributes & "PKG={FGE50C3/DEFAULT(IBM),2,0,1,0,512}" & Chr$(0)
        strAttributes = strAttributes & Chr$(0)
        intRet = SQLConfigDataSource(vbNull, 4, strDriver, strAttributes)
        If intRet Then
            MsgBox "DSN Created"
        Else
            MsgBox "Create Failed"
        End If
     
    End Sub
    rageant !

    J'ai essayé d'utiliser la méthode SQLWriteFileDSN, mais çà ne fonctionne pas : quelle est la syntaxe exacte ?

  6. #6
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Hmmm ... rageant, oui.

    Les accolades ne concernent que strAttributes, pas strDriver.

    Je note une différence entre mon code et celui de la faq, au niveau du premier argument de la fonction SQLConfigDataSource.
    Cet argument est censé être un handler de fenêtre Windows.
    vbNull vaut 1, et je ne sais pas si c'est un handler valide.
    Il est plus sûr de mettre 0, qui sera interprété par la fonction comme "aucune fenêtre".

    Tu peux aussi essayer avec le code que j'ai mis ici.
    C'est le même que celui de la faq, mais avec (j'espère) récupération du message d'erreur.

    Autre choses à essayer.
    Essayer de créer un DSN minimaliste : Un nom de DSN et un nom de pilote.
    Cela permet au moins de valider l'usage de la fonction SQLConfigDataSource.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub OBCD()
        '---- Créer un DSN ---------
        Dim strDriver As String
        Dim strAttributes As String
        Dim intRet As Long
     
        strDriver = "Client Access ODBC Driver (32-bit)" & Chr$(0)
        strAttributes = "DSN=ODBCKPI" & Chr$(0)
    '    strAttributes = strAttributes & "DESCRIPTION=Test DSN" & Chr$(0)
    '    strAttributes = strAttributes & "UID=BAUDP" & Chr$(0)
    '    strAttributes = strAttributes & "System=LV011BK" & Chr$(0)
    '    strAttributes = strAttributes & "DATABASE=FGE50C3" & Chr$(0)
    '    strAttributes = strAttributes & "SIGNON=1" & Chr$(0)
    '    strAttributes = strAttributes & "DBQ=FGE50C3" & Chr$(0)
    '    strAttributes = strAttributes & "DFTPKGLIB=FGE50C3" & Chr$(0)
    '    strAttributes = strAttributes & "PKG={FGE50C3/DEFAULT(IBM),2,0,1,0,512}" & Chr$(0)
        strAttributes = strAttributes & Chr$(0)
        intRet = SQLConfigDataSource(0, 4, strDriver, strAttributes)
        If intRet Then
            MsgBox "DSN Created"
        Else
            MsgBox "Create Failed"
        End If
     
    End Sub
    Essaie ensuite d'ajouter des attributs, en "décommentant" des lignes, et en réexécutant la Sub.

    A+

Discussions similaires

  1. Insertion documents word dans champ objet OLE sous VBA
    Par frankouche dans le forum Access
    Réponses: 4
    Dernier message: 20/12/2006, 21h35
  2. Erreur de Création Source ODBC
    Par touhami dans le forum Delphi
    Réponses: 3
    Dernier message: 15/07/2006, 10h32
  3. problème de création de requète sous VBA
    Par Golork dans le forum Access
    Réponses: 4
    Dernier message: 02/06/2006, 14h35
  4. Création de formulaire en VBA - Plantage
    Par Shansson dans le forum Access
    Réponses: 2
    Dernier message: 18/04/2006, 15h48
  5. objet shape en vba sous excel
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/11/2005, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo