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

Bases de données Delphi Discussion :

[Interbase]Importer une base de données MySQL


Sujet :

Bases de données Delphi

  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut [Interbase]Importer une base de données MySQL
    Bonjour,

    Je doit importer une base de données MySQL en ligne dans un programme Delphi utilisant Interbase.
    Le programme fonctionne très bien lors que je fais (j'ai pris une requête de la FAQ au hasard) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IBQuery.SQL.Text := 'create table IODescriptorEx(IOId int not null,IOFileMask VarChar(30),'+
                                        'AlternativeDesc VarChar(50));';
    Par contre quand je teste avec mon script d'importation (qui ne contient que des CREATE TABLE et des INSERT), j'ai une belle exception lors du commit :
    Le projet projet1.exe a provoqué une classe d'exception EIBClientError avec le message 'Erreur d'analyse SQL : Nom de paramètre attendu'.[...]
    Sachant que la requête fait près de 400 lignes, il n'y a pas un moyen d'obtenir plus d'information ?
    La requête fonctionne très bien sous MySQL, voici un bout de la reqête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE competences (
      idCOMPETENCES integer unsigned,
      Niveau integer,
      Description varchar(45)
    );
     
    INSERT INTO competences (idCOMPETENCES, Niveau, Description) VALUES ('1', '10', 'MOYEN'),
     ('3', '20', 'EXPERT')
    ;
    Comme ça provient d'un site, les caratères accentués sont transformés en caractères HTML et les apostrophes précédés du caractère '\' (le problème vient peu être de là ).

    Par avance, merci pour votre aide

  2. #2
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    Il arrive en effet que les requetes sql bloquent lorsqu'on transforme du texte en html et vice versa...

    Qu'est-ce que tu utilises pour transformer ton html en texte?

    Selon les procédures, les apostrophes ' ou " sont transformées, et cela plante les requetes au milieu.

    On peut avoir un truc du genre:
    - en dur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO competences (idCOMPETENCES, Niveau, Description) 
    VALUES ('1', '10', desc),('3', '20', desc2)
    - en sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO competences (idCOMPETENCES, Niveau, Description) 
    VALUES ('1', '10', 'il s'agit du niveau moyen'),('3', '20', 'il s'agit du niveau expert')
    la requete va forcément planter parce qu'il tombe sur fin de chaine, alors qu'il y a encore qqch derrière.
    Ca peut provoquer des erreurs assez variées selon où ca tombe...

    As-tu bien vérifié s'il n'y a pas quelques carractères spéciaux dans ce genre qui ne traine pas?
    Si c'est pas ca... alors ca se complique !

  3. #3
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut,

    Sous Interbase/Firebird ton script risque de ne pas être accepté. Je l'écrirais plutôt comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO competences (idCOMPETENCES, Niveau, Description)
    VALUES ('1', '10', 'MOYEN');
    INSERT INTO competences (idCOMPETENCES, Niveau, Description)
    VALUES ('3', '20', 'EXPERT');
    Par contre le message d'erreur:
    'Erreur d'analyse SQL : Nom de paramètre attendu'.[...]
    me laisse à penser qu'un petit caractère ':' traine par là !

    @+

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Alyx²
    Qu'est-ce que tu utilises pour transformer ton html en texte?
    C'est en fait un script php qui génère du texte pure que je récupère avec un simple TIdHTTP.Get :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IBQuery.SQL.Text := Get ('http://127.0.0.1/export.php');
    Citation Envoyé par Alyx²
    Selon les procédures, les apostrophes ' ou " sont transformées, et cela plante les requetes au milieu.
    A priori (je n'est pas regardé le script en détail), les apostrophes sont déjà échapées.

    Pour essayer de cibler le problème, j'ai réduit le script en gardant que les créations de tables (ça m'a permis de supprimé le type unsigned qui ne semblais pas être apprécié) et j'ai une erreur au second CREATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE chaine (
      idCHAINE integer ,
      idSITES integer ,
      CodeChaine varchar(20),
      idCONTACTS integer 
    );
    CREATE TABLE clients (
      idCLIENTS integer ,
      CodeClient varchar(20),
      Nom varchar(45)
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Dynamic SQL Error
    SQL error code = -104
    Token unknow - line 7, char -1
    CREATE'.
    J'ai bien sûr essayé de remplacer les caractères de saut de ligne par \r\n dans le script php mais ça me donne une erreur à la ligne précédente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Dynamic SQL Error
    SQL error code = -104
    Token unknow - line 6, char -1
    )'.
    [edit]@Claudius40 : come je suis parti sur les CREATE, j'ai mis une requête par ligne mais ça ne change rien[/edit]

  5. #5
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    Euh... on met vraiment des ; à la fin des requetes dans MySQL?

    Bon d'accord, je sors...
    Cela dit, ca ressemble vraiment à un truc comme ca. Il y a un caractère entre tes requetes qui le stresse!

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Alyx²
    Cela dit, ca ressemble vraiment à un truc comme ca. Il y a un caractère entre tes requetes qui le stresse!
    C'est pour ça que j'ai pensé aux sauts de lignes, mais même en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IBQuery.SQL.Text := 'CREATE TABLE chaine (idCHAINE integer, idSITES integer , CodeChaine varchar(20), idCONTACTS integer);';
    IBQuery.SQL.Add ('CREATE TABLE clients (idCLIENTS integer, CodeClient varchar(20), Nom varchar(45));');
    Par contre les deux requètes marchent séparemment, je me demande si c'est pas moi qui le stresse

    Il est quand même possible d'avoir plusieurs commandes dans une même requètes ?

  7. #7
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Bonjour,

    Non il n'es pas possible d'avoir plusieurs commande dans un objet TQuery.

    Tu devrais enregistrer un fichier et le lancer sous forme de script avec une commande shellexcecute et le programme isql

    a+
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par gege2061
    Il est quand même possible d'avoir plusieurs commandes dans une même requètes ?
    Avec un TIBSQL sûrement, mais avec un TIBQuery je ne pense pas !

    @+

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Claudius40
    Avec un TIBSQL sûrement
    J'ai eu une lueur d'espoir mais j'obtiens les mêmes erreurs

    Bon je crois que je vais aller au plus simple en découpant mon fichier ligne par ligne, en plus ça sera plus facile à debuguer


  10. #10
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par Yurck
    Bonjour,

    Non il n'es pas possible d'avoir plusieurs commande dans un objet TQuery.

    Tu devrais enregistrer un fichier et le lancer sous forme de script avec une commande shellexcecute et le programme isql

    a+
    Ah ben voui... C'est normal alors...

    Un script serait surement le plus simple. Mais si tu préfères rester dans ton programme, en stockant tes requetes dans un tableau (ou un truc du genre), avec un bon for, ca doit être faisable. C'est pas dit que ca soit très court par contre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i:= 0 to NbLigneTab do
    begin
      if Query.state<>dsInactive then Query.close ;
      Query.sql.clear ;
      Query.sql.add(Tab[i]) ;
      Query.sql.open ;
    end ;
    Par contre il faudrait peut-être gérer les prepare-unprepare, voire utiliser ExecSQL au lieu d'ouvrir et fermer la table.

    Enfin, il y a surement mieux...

    Bon courage!

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

Discussions similaires

  1. Importer une base de données MySQL
    Par jessjess dans le forum Administration
    Réponses: 5
    Dernier message: 20/10/2011, 13h58
  2. aide pour importer une base de données sous MySQL
    Par karimeri dans le forum Débuter
    Réponses: 4
    Dernier message: 20/01/2010, 18h02
  3. [XML] importer un fichier .log ou .xml dans une base de donnée MySQL
    Par sorayati dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/08/2009, 16h16
  4. Réponses: 4
    Dernier message: 08/01/2009, 15h01
  5. importer une fichier excel dans une base de donnée MySQL
    Par maverick56 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 29/05/2007, 09h15

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