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 :

Erreur étrange sur une execution de requete sql


Sujet :

Bases de données Delphi

  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Octobre 2007
    Messages : 13
    Par défaut Erreur étrange sur une execution de requete sql
    Bonjour,

    J'ai une erreur que je n'arrive pas à résoudre.
    je et une requete sql dans une variable, que j'execute ensuite grace à un database.execute()
    Comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TFrmPrincipal.Button7Click(Sender: TObject);
    var
    commande_sql : string;
    begin
     commande_sql := 'LOAD DATA  INFILE "' + '//opt//appli//donnees//spool//referentiel//' +
     'toto.csv" INTO TABLE matable FIELDS TERMINATED BY '';'' ENCLOSED BY ''"'' ESCAPED BY ''\\'' LINES TERMINATED BY ''\r\n''';
     FrmPrincipal.Database1.Execute(commande_sql);
     showmessage('fichier importé.');
    end;
    J'ai voulu comprendre le fonctionnement d'Execute() et quelque genre de message elle renvoi.
    J'ai donc mis le retour dans une variable integer.
    Comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TFrmPrincipal.Button7Click(Sender: TObject);
    var
    commande_sql : string;
    recup := integer;
    begin
     commande_sql := 'LOAD DATA  INFILE "' + '//opt//appli//donnees//spool//referentiel//' +
     'toto.csv" INTO TABLE matable FIELDS TERMINATED BY '';'' ENCLOSED BY ''"'' ESCAPED BY ''\\'' LINES TERMINATED BY ''\r\n''';
     recup := FrmPrincipal.Database1.Execute(commande_sql);
     showmessage('fichier importé.'+ inttostr(recup));
    end;
    Et bien ce code ne fonction ne pas et me renvoi une erreur de violation d'accés.
    Je précise que ce message n'apparait que lorsque la variable recup est integer. Sinon ça ne compile pas
    Voir l'image ce dessous.

    Nom : Capture.PNG
Affichages : 205
Taille : 9,6 Ko

    Merci de votre aide et de prendre sur votre temps.

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    le composant Tdatabase sert a l'acces a la base de donnée
    pour executer les requette ou commande sql utilise les dataset de préférence

    le exec du Tdatabase sert a sa connexion

    utilise plutot le "ExecSql" d'un tQuery

    exemple de code pouvant t'aider a utiliser les TQuery

    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
    29
     
    Procedure TDmMonProg.ExecQuery(aData: TQuery);
    begin
      If aData.Sql.Count > 0 Then
      Try
        aData.ExecSql;
        aData.Sql.Clear;
      Except
        Raise;
      End;
    end;
     
    procedure TDmMonProg.EndSql;
    begin
      execQuery(QrMaj);
    end;
     
    procedure TDmMonProg.AddSql(cmd : String);
    begin
      QrMaj.SQL.Append(cmd);
      if (Length(QrMaj.SQL.Text) > 30000) then
        EndSql;
    end;
     
    procedure TDmMonProg.execSql(cmd : String);
    begin
      AddSql(cmd);
      EndSql;
    end;
    ensuite dans le programme tu l'utilise ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TDmMonProg.Button7Click(Sender: TObject);
    var
    commande_sql : string;
    begin
     commande_sql := 'LOAD DATA  INFILE "' + '//opt//appli//donnees//spool//referentiel//' +
     'toto.csv" INTO TABLE matable FIELDS TERMINATED BY '';'' ENCLOSED BY ''"'' ESCAPED BY ''\\'' LINES TERMINATED BY ''\r\n''';
     execSql(commande_sql);
     showmessage('fichier importé.');
    end;

  3. #3
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Désolé mais le composant TDatabase est tout à fait capable d'exécuter des requêtes. Je le fais régulièrement.

    Test 1: mettre un point d'arrêt juste après la composition de la requête, faire un copier-coller du texte et l'essayer en direct hors Delphi.

    Test 2: englober l'appel dans un try except pour essayer d'avoir plus de précision sur le code erreur renvoyé.

  4. #4
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Octobre 2007
    Messages : 13
    Par défaut
    Bonjour,

    Merci a vous deux pour votre réponse.

    Effectivement le code avec l'Execute et donc le Tdatabase fonctionne pour lancer les requêtes. ce n'est par contre peut être pas la meilleur méthode, je ne sais pas.
    c'est lorsque j'essaye de mettre le résultat dans la variable recup qu'il bloque. Je veux dire par la que l'erreur viens de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    recup := FrmPrincipal.Database1.Execute(commande_sql);
    Soit parce que le type n'est pas bon ( ce qu'il ne semble pas), soit parceque delphi ne sait pas interpréter ça, soit autre chose.
    L'englober dans un try catch me sort exactement la même erreur et il s'arrête a la même ligne.

  5. #5
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    et dans le var, c'est vraiment codé comme ça ??

    recup := integer;

  6. #6
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Octobre 2007
    Messages : 13
    Par défaut
    non...

    var
    recup : integer;

  7. #7
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Le source de la fonction execute est censé renvoyer un nombre de lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      if (Cursor = nil) and (DbiGetProp(hDBIObj(StmtHandle), stmtROWCOUNT,
                              @Result, SizeOf(Result), Len) <> 0) then
        Result := 0;
    Vu que ta requête n'est pas dans ce cas, il est probable que le @Result fasse un peu la gueule dans DbiGetProp.

Discussions similaires

  1. Boucle sur une table SAS requete SQL
    Par tidou95220 dans le forum SAS Base
    Réponses: 10
    Dernier message: 19/02/2013, 11h27
  2. Réponses: 9
    Dernier message: 24/03/2011, 10h11
  3. Réponses: 2
    Dernier message: 27/05/2009, 13h57
  4. erreur 2465 sur une requete DELETE
    Par aba_tarn dans le forum VBA Access
    Réponses: 7
    Dernier message: 19/02/2008, 07h35
  5. Erreur etrange sur une requete
    Par mael94420 dans le forum ASP
    Réponses: 3
    Dernier message: 12/03/2006, 22h25

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