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 :

Lire une table ODBC sans l'importer ou la lier


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Lire une table ODBC sans l'importer ou la lier
    Bonjour,

    Depuis VBA Access, j'essaie de lire une table ODBC sans avoir à l'importer ou à la lier dans ma base de données Access.

    Je sais que je dois avoir une fonction getConn par exemple et puis exécuter la requête comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ssql = "INSERT INTO Quote ( CODE, DEVISE)"
    ssql = ssql & " SELECT dbo_View.name_id, dbo_View.currency_id"
    CurrentDb.Execute ssql, getConn
    J'aimerais donc savoir comment peut-on coder une telle fonction getConn.

    où la table dbo_View est ma table ODBC et Quote une table de ma base Access.

    Merci de votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    getconn représente en fait une connexion ADODB.

    si tu lance ta requête avec la connexion à ta base en ODBC, il va chercher la table Quote dans ta base externe et non pas en local.
    Une solution consiste à définir un recordset sur ta table externe et insérer une à une les lignes dans ta table locale Quote :

    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
     
    Dim cnn As New ADODB.connection, rst As New ADODB.Recordset, rsQuote as DAO.recordset
        ' Ouverture de la connexion
        cnn.Open "ODBC;DSN=...." 
     
        ' Ouverture d'un Recordset en défilement en avant, et en lecture seule
        rst.Open "SELECT name_id,currency_id FROM dbo_View", cnn,  adOpenForwardOnly, adLockReadOnly
     
        ' insertion dans la table QUOTE
        set rsQuote = currentdb.openrecordset("Select code, devise from Quote")
     
        while not rst.EOF
           rsQuote.addnew
           rsQuote.fields("code") = rst.fields("name_id")
           rsQuote.fields("devise") = rst.fields("currency_id")
           rsQuote.update
           rst.movenext
        wend
        rsQuote.close
        rst.close

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup pour la réponse.

    J'ai essayé avec le code mais j'obtiens un problème au niveau de la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rst.Open "SELECT name_id,currency_id FROM dbo_View", cnn,  adOpenForwardOnly, adLockReadOnly
    Voici l'erreur obtenue :

    [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]dbo_View not found. Specify owner.objectname or use sp_help to check whether the object exists (sp_help may produce lots of output).

    Merci.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    le problème semble venir du fait qu'il ne trouve pas la table dbo_view sous SQL_Server.

    Si avec ta chaine de connexion, tu a accès à plusieurs bases utilisateur, il faut préciser [user].dbo_View

    pour le user, essaies de mettre le user que tu as mis dans ta chaine de connexion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rst.Open "SELECT name_id,currency_id FROM user.dbo_View", cnn,  adOpenForwardOnly, adLockReadOnly

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    J'obtiens la même erreur mais cette fois-ci avec :

    [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]user.dbo_View not found. Specify owner.objectname or use sp_help to check whether the object exists (sp_help may produce lots of output).

    Il n'existe pas un autre moyen de lire la table ?

    Merci de votre aide.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Citation Envoyé par zlatan13 Voir le message
    J'obtiens la même erreur mais cette fois-ci avec :

    [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]user.dbo_View not found. Specify owner.objectname or use sp_help to check whether the object exists (sp_help may produce lots of output).

    Il n'existe pas un autre moyen de lire la table ?

    Merci de votre aide.
    Je ne te disais pas de mettre explicitement "user.dbo_view"

    Ce qu'il lui manque c le nom de l'utilisateur de ta base sqlServer propriétaire de dbo_view.
    Dans ta chaine de connexion, tu as bien mis un truc du genre "ODBC;... UID=<un nom d'utilisateur>;PWD=<un mot de passe>" ???

    Si oui, c ce que tu a mis après le = de UID qu'il faut mettre à la place de user.
    Si non, (c peut-être déjà configuré dans ton DSN), alors il faut que tu regarde dans ton DSN, le nom du user (Demarrez/Panneau de configuration/Outils d'administration/source de données ODBC)

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    J'ai bien remplacé user par mon login.
    Le problème ne se pose pas au niveau de la chaine de connexion.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    L'erreur qu'il te sort n'est pas au niveau de la chaine de connexion mais au niveau de la requête SQL que tu essaie d'exécuter à travers cette connexion.

    Le message d'erreur t'indique qu'il ne trouve pas sous sqlServer de profil utilisateur "user" qui contiennent une table ou une vue dbo_view.

    As-tu un moyen de consulter ta base de données ? (SQL Developer, SQL Tools ???)
    Est-ce que lorsque tu te connectes à ta bases de données avec ton login et ton password, tu as accès à une table ou une vue dbo_view ??? Le problème vient de là et pas de la façon d'accèder aux données. il veint des droits d'accès à la table/vue dbo_view

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    J'arrive à lier ou importer la table manuellement sans problème en insérant le login et le mot de passe, je peux dés lors ouvrir la table, lire les données,...

    Une fois la table liée ou importée, tout se passe comme si j'avais la table physiquement présente dans ma base donc pas de souci au niveau de la requête, c'est justement le fait de devoir importer/lier la table qui me dérange.

    Merci.

  10. #10
    Expert éminent
    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
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    essaie dbo.View au lieu de dbo_View.
    dbo est certainement le nom du owner, et View le nom de l'objet.

    A+

  11. #11
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    En fait, j'ai essayé avec dbo.View et ca marche.

    Merci LedZeppII.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire une fichier XLS sans excel
    Par petitcoucou31 dans le forum API, COM et SDKs
    Réponses: 10
    Dernier message: 06/10/2008, 15h03
  2. [Tableaux] Lire une table simple avec foreach
    Par dreeve dans le forum Langage
    Réponses: 2
    Dernier message: 21/03/2008, 18h38
  3. Effacer une table Fichier sans supprimer
    Par Loko dans le forum WinDev
    Réponses: 3
    Dernier message: 10/12/2007, 13h33
  4. [Conception] Je voudrais lire une table en continu
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 25
    Dernier message: 12/10/2006, 11h47
  5. Peut on lire des tables Paradox sans le BDE ?
    Par der§en dans le forum Bases de données
    Réponses: 3
    Dernier message: 02/11/2005, 11h42

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