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

Lazarus Pascal Discussion :

TSQLQuery : Erreur 'SQLQuery1 : Cannot open a non-select statement' [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 362
    Points : 586
    Points
    586
    Billets dans le blog
    2
    Par défaut TSQLQuery : Erreur 'SQLQuery1 : Cannot open a non-select statement'
    Bonjour à vous,

    J'utilise le composant TSQLQuery pour attaquer une BDD MySQL.

    Je veux mettre une table à jour via:

    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
     
    procedure UpdateTableTroncons(const TR: TCanalTroncon);
      var
        Rq: String;
      begin
        try
          try
            Rq := Format('UPDATE %s ', [TABLE_TRONCONS]) +
                  Format('SET LongueurTroncon=%.2f, TempsParcoursOptimal=%.2f ', [TR.LongueurTroncon, TR.TempsOptimal]) +
                  Format('WHERE NomTroncon="%s" LIMIT %d;', [TR.NomTroncon, 1]);
            AfficherMessage(Rq);
            FSQLQuery.Open;
            FSQLQuery.SQL.Clear;
            FSQLQuery.SQL.Text := Trim(Rq);
            FSQLQuery.ExecSQL();
     
            FSQLQuery.ApplyUpdates(666);
            FSQLTransaction.Commit; // indispensable sinon çà ne marche pas
          except
            on E: Exception do AfficherMessage(E.Message);
          end;
        finally
          FSQLQuery.Close;
        end;
      end;
    Cette section est dans une boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     //FSQLTransaction.StartTransaction;
      for i := 0 to GetNbTroncons - 1 do
      begin;
        myTroncon := GetTroncon(i);
        UpdateTableTroncons(myTroncon);
      end;
    Commande MySQL:

    UPDATE troncons_new SET LongueurTroncon=615.36, TempsParcoursOptimal=24.61 WHERE NomTroncon="Tr_5742.00 2" LIMIT 1;

    Dès le deuxième tour de boucle, le message d'erreur suivant est envoyé:

    SQLQuery1 : Cannot open a non-select statement

    J'ai beau individualiser les requêtes, rien n'y fait.

    Je ne sais que faire et çà fait deux heures que je galère avec çà.

    Bien entendu, chaque requête est ouverte et fermée correctement.

    L'équipe Lazarus, qui fait du très bon travail, gagnerait à améliorer le contrôle qualité des composants fondamentaux comme ceux d'interrogation de BDD. A mon avis, il n'est pas normal qu'un composant fonctionne une fois sur deux. Ceci occasionne d'énormes pertes de temps pour résoudre des problèmes qui n'ont pas lieu d'être.

    On comprend pourquoi Embarcadero et consorts peuvent vendre très cher leurs produits: en milieu professionnel et institutionnel, le coût de la licence est souvent très largement compensé par la qualité des composants et de la documentation.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 403
    Points
    11 403
    Billets dans le blog
    6
    Par défaut
    Si j'ai bien compris et me souviens bien des conseils récemment lus, un Query doit être ouvert (Open) s'il retourne des valeurs, mais pour une requête sans retour, il faut juste l'exécuter (ExecSQL).

    Ton Open déclencherait donc sûrement l'erreur et le Close ne serait sûrement pas utile. A vérifier. Et si c'est bien l'explication, ce serait donc lié à une utilisation incorrecte des composants, et non à tel ou tel IDE.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 33
    Points : 102
    Points
    102
    Par défaut
    Oui d'accord avec Tourlourou, l'équipe de développement de Lazarus n'y est pour rien car c'est l'utilisation erroné du composant qui est en cause et pas le SqlQuery qui fonctionne très bien, exemple (extrait) pour le remplissage d'une table dans une boucle, inutile de faire 2 procédures, autant faire tout en une :

    J'ouvre un fichier XLM, si c'est ok je remplie la table dans une boucle While.
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
     
    try
       SQLTransaction1.StartTransaction; {Demmarre la transaction}
     
       {Recherche le premier noeud}
       NodesRecord := Content.FirstChild;
     
       while NodesRecord <> nil do
        begin
          F_name := '';
          F_note := '';
          F_Op   := '0';
          F_Mode := '0';
          F_Day  := '0';
          F_Top  := '0';
     
          {recuperation des donnees}
          NodesName := NodesRecord.FindNode(FNameType);
          if NodesName <> nil then
             F_name := NodesName.TextContent;
          NodesNote := NodesRecord.FindNode(FNoteType);
          if NodesNote <> nil then
             F_note := NodesNote.TextContent;
          NodesOp := NodesRecord.FindNode(FOpType);
          if NodesOp <> nil then
             F_Op := NodesOp.TextContent;
          NodesMode := NodesRecord.FindNode(FModeType);
          if NodesMode <> nil then
             F_Mode := NodesMode.TextContent;
          NodesDay := NodesRecord.FindNode(FDayType);
          if NodesDay <> nil then
             F_Day := NodesDay.TextContent;
          NodesTop := NodesRecord.FindNode(FTopType);
          if NodesTop <> nil then
             F_Top := NodesTop.TextContent;
     
           F_name := QuotedStr(F_name);
           F_note := QuotedStr(F_note);
     
           try
            TypeOperation := StrToInt(F_Op);
           except
            TypeOperation := 0;
           end;
     
           try
            Modevalue := StrToInt(F_Mode);
           except
            Modevalue := 0;
           end;
     
           try
            DayValue := StrToInt(F_Day);
           except
            DayValue := 0;
           end;
     
           if DayValue > 31 then
              DayValue := 31;
     
           try
            Topvalue := StrToInt(F_Top);
           except
            Topvalue := 0;
           end;
     
           if Topvalue > 31 then
              Topvalue := 31;
     
            sSQL := Format('INSERT INTO T_TYPE(F_userparent, F_name, F_comment, F_optype, '+
                           'F_modevalue, F_dayvalue, F_topvalue) VALUES (%d, %s, %s, %d, %d, %d, %d)',
                            [user, F_name, F_note, TypeOperation, Modevalue, DayValue, Topvalue]);
     
            DataModule1.SQLQuery1.SQL.Text := sSQL;
            DataModule1.SQLQuery1.ExecSQL;
     
          NodesRecord := NodesRecord.NextSibling;
        end;
     
       DataModule1.SQLTransaction1.Commit;
       DataModule1.SQLTransaction1.EndTransaction; {Fin de la transacrion}

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 33
    Points : 102
    Points
    102
    Par défaut
    Bon alors monsieur JP CASSOU, les réponses ont elles apportées les réponses souhaitées, c'est pas la peine de venir se plaindre de Lazarus (qui soit dit en passant n'y était pour rien) et ensuite ne pas venir remercier les contributeurs voire au moins venir dire si le problème est résolu !

  5. #5
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 362
    Points : 586
    Points
    586
    Billets dans le blog
    2
    Par défaut [RESOLU] Erreur 'SQLQuery1 : Cannot open a non-select statement'
    Citation Envoyé par SoftChris Voir le message
    Bon alors monsieur JP CASSOU, les réponses ont elles apportées les réponses souhaitées, c'est pas la peine de venir se plaindre de Lazarus (qui soit dit en passant n'y était pour rien) et ensuite ne pas venir remercier les contributeurs voire au moins venir dire si le problème est résolu !
    Je suis passé à autre chose entre temps (le pb a été temporairement contourné) donc réponse tardive.

    Sinon, TSQLQuery.Open (et son collègue Close) ne doit être effectivement utilisé que pour des requêtes SELECT.

    Par contre, il semble que la transaction doit être committée pour implémenter les modifs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FSQLTransaction.Commit;
    Donc: pb résolu et avec mes excuses pour cette réponse tardive.

    Par contre, je maintiens que le TSQLQuery.Open / Close devrait être obligatoire et ne pas provoquer d'erreur liée à une requête non-SELECT, ceci pour des raisons d'homogénéité de l'utilisation de ce composant.

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

Discussions similaires

  1. Erreur HaProxy (cannot bind socket, select test FAILED)
    Par Laurent4242 dans le forum Administration système
    Réponses: 0
    Dernier message: 25/06/2014, 07h29
  2. erreur :Cannot open database
    Par souuumia dans le forum C#
    Réponses: 5
    Dernier message: 15/04/2010, 13h28
  3. erreur: cannot open display
    Par Balbuzard dans le forum Réseau
    Réponses: 3
    Dernier message: 28/04/2009, 02h25
  4. Réponses: 1
    Dernier message: 23/01/2008, 16h35
  5. Pb avec crystal report - erreur 20599 - cannot open sql serveur
    Par casanova_shadow dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/11/2007, 12h45

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