Importation d’un fichier SQL

Je souhaiterais exécuter une série d’instructions SQL placées dans un fichier texte. Comment faire ?

sqlreader_journal_ok.jpg

Scénario

En général, quand vous importez des données dans Access, elles sont dans un format texte (délimité/CSV, largeur fixe), ou Excel. Dans ce cas, vous n’êtes pas concerné par cet article. 🙂

Par contre, ce qui suit peut vous intéresser si :

  • vous devez injecter des données à partir d’un fichier SQL contenant une série de INSERT INTO (ou DELETE, UPDATE).
  • vous devez modifier la structure de vos tables à partir d’instructions SQL ALTER TABLE. Ce scénario est pratique si vous devez faire évoluer une base « à distance », sans pouvoir intervenir manuellement dessus. Une approche peut consister à faire exécuter une séquence d’instructions SQL sur la base à modifier.

Par exemple, voici une séquence SQL simple qu’on souhaite dérouler dans Access :

Problèmes

  • Access ne gère pas les commentaires SQL (démarrant par deux tirets).
  • Une phrase SQL exécutée par CurrentDb.Execute ou DoCmd.RunSQL ne peut contenir qu’une seule instruction.

Solution

On va mettre en place une petite moulinette pour traiter ce type de fichiers et exécuter la séquence SQL comme il faut. J’en profite pour ajouter une journalisation simplifiée des actions, de façon à détecter facilement quelle instruction aurait échoué. Voici comment faire la mise en place :

  1. Dans le menu Outils / Références de Visual Basic Editor, cochez la bibliothèque Microsoft Scripting Runtime. Elle est utilisée pour la lecture de fichiers texte.
  2. Créez un module de classe (pas un module standard), et recopiez-y ce qui suit. La classe sera appelée SQLReader.

Tester le code

Pour tester tout ça :

  1. Créez un fichier SQL, par exemple en recopiant les instructions SQL plus haut. Dans ce cas, votre base est supposée avoir une table tbl Newsletter, avec des champs Nom (Texte) et Prénom (Texte). Si ce n’est pas le cas, une erreur se produira (mais ça peut être l’occasion de tester la gestion des erreurs par SQLReader !).
  2. Créez un module standard, et recopiez ce code, en aménageant le chemin du fichier SQL :

Ce code crée une instance de SQLReader, renseigne le chemin du fichier SQL à charger, définit le niveau de détail (Verbosity) du journal d’erreurs, et exécute la séquence SQL. En cas d’erreur, le bloc-notes Windows affiche le journal des erreurs.

Journal d’exécution

Un journal trace l’exécution de chaque commande.

  • Par défaut, il s’appelle sqllog.txt, et il est placé dans le même dossier que la base de données.
  • Vous pouvez définir son niveau de détail comme plus haut. sr.Verbosity = Verbose (maximum de détails), sr.Verbosity = CommandsOnly (seules les commandes SQL sont tracées, pas les commentaires), sr.Verbosity = none (rien n’est journalisé).

sqlreader_journal.jpg

Vous aimerez aussi...

8 réponses

  1. Walid dit :

    Bonjour,

    Je me permets un tout petit commentaire. A l’exécution le log n’est pas placé dans le même dossier que la base de données mais dans le dossier parent (en tout cas sur mon poste)
    Pour corriger cela il faut modifier la fonction de la manière suivante :
    Property Get LogFile() As String
    LogFile = CurrentProject.Path & « \ » & « sqllog.txt »
    End Property

    C’est juste un petit détail.. En tout cas merci mile fois 🙂

    • Hervé Inisan dit :

      Merci pour le retour. Effectivement, lorsque j’ai migré le blog il y a quelque temps, des \ ont été avalés par la procédure. En voici un ! 🙂
      J’ai corrigé sur l’article (on peut simplifier votre concaténation).

  2. Jµstin dit :

    Bonjour Hervé,
    Tout d’abord, merci beaucoup de tous vos posts qui me sont toujours d’une grande aide…
    J’arrive à faire fonctionner l’importation de fichier avec votre exemple, pensez-vous qu’il est possible d’importer des fichiers SQL pour automatiser la création de requête via SELECT ?
    Sans surprise, j’ai tout de même fait le test mais cela ne fonctionne pas ^^

    Merci de votre réponse

    • Hervé Inisan dit :

      Le code fourni est plutôt prévu pour exécuter des instructions SQL en séquence (des requêtes Action au sens Access, c’est-à-dire des requêtes qui ne renvoient pas de résultat). Du coup effectivement :
      – Les requêtes SELECT ne fonctionneront pas dans ce scénario.
      – L’outil ne crée pas d’objets dans la base de données, comme des nouvelles requêtes.
      Si j’ai suivi, l’idée est de stocker des instructions SELECT et de les créer automatiquement dans la base ?

  3. Somers Jean dit :

    Bonjour, Hervé.

    Je rencontre un problème à l’exécution du module standard: Erreur de compilation: type défini par l’utilisateur non défini.

    Après validation, ce qui est surligné est: Function Execute() As Boolean.

    As-tu un indice?!!!
    Merci.

    • Hervé Inisan dit :

      Somers Jean > Le code est bien copié dans un module de classe (appelé SQLReader) ?
      Et la référence Microsoft Scripting Runtime est bien activée ?
      Sinon, au cas où : où s’arrête la compilation après un Debogage/Compiler ?

  4. Hervé Inisan dit :

    nmiyer > Tu as bien recopié la portion de code dans un module de classe ? (et en début de ce module ?)

  5. nmiyer dit :

    Bonjour herve,

    je n’arrive pas à faire fonctionner le code de ton importation de fichier j’ai une erreur au niveau de « Option Compare Database »
    erreur attendu : texte ou Binary
    Merci

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *