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 :

Ma requête SQL DELETE ne fonctionne pas [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Par défaut Ma requête SQL DELETE ne fonctionne pas
    Bonjour,

    Dans mon programme, j'interroge ma base de données avec des requêtes de type SELECT. Jusque là tout va bien.
    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
      // Initialisation de la base de données
      IHM_FenetrePrincipale.IHM_DbSqliteConnection.DatabaseName:= DB_FileName;
      IHM_FenetrePrincipale.IHM_DbSqliteConnection.Connected := True;
      IHM_FenetrePrincipale.IHM_DbSqliteQuery.SQL.Clear;
      // Requete sql pour obtenir tous les Noms
      IHM_FenetrePrincipale.IHM_DbSqliteQuery.SQL.Add('SELECT DISTINCT "Nom" FROM table ORDER BY "Nom" ASC');
      IHM_FenetrePrincipale.IHM_DbSqliteQuery.ExecSQL;
      IHM_FenetrePrincipale.IHM_DbSqliteQuery.Active:= true;
     
      // Ajout des noms dans le chklistbox
      while not IHM_FenetrePrincipale.IHM_DbSqliteQuery.EOF do
      begin
        IHM_FenetrePrincipale.IHM_ChklistboxNom.Items.Add(IHM_FenetrePrincipale.IHM_DbSqliteQuery.FieldByName('Nom').AsString);
        IHM_FenetrePrincipale.IHM_DbSqliteQuery.Next;
      end;
     
      // Fermeture de la base de données
      IHM_FenetrePrincipale.IHM_DbSqliteQuery.Close;
      IHM_FenetrePrincipale.IHM_DbSqliteConnection.Close;
    Par contre, lorsque j'essaie de faire une requête de type DELETE, là je coince.
    Je n'ai pas de message d'erreur et aucun enregistrement n'est effacé.
    La requête que j'envoie fonctionne très bien avec SQLITEMAN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
              req := req + '"' + tag_checked[i] + '"';
              // Initialisation de la base de données pour requete
              IHM_FenetrePrincipale.IHM_DbSqliteConnection.DatabaseName:= DB_FileName;
              IHM_FenetrePrincipale.IHM_DbSqliteConnection.Connected := True;
              IHM_FenetrePrincipale.IHM_DbSqliteQuery.SQL.Clear;
              // Execution de la requete
              IHM_FenetrePrincipale.IHM_DbSqliteQuery.SQL.Add(req);
              IHM_FenetrePrincipale.IHM_DbSqliteQuery.Prepare;
              ShowMessage(req);
              IHM_FenetrePrincipale.IHM_DbSqliteQuery.ExecSQL;
              // Fermeture de la base de données
              IHM_FenetrePrincipale.IHM_DbSqliteQuery.Close;
              IHM_FenetrePrincipale.IHM_DbSqliteConnection.Close;

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Koa,

    Vu ton code, ta requête est dans le brouillard :

    Comment veux-tu qu'on sache ce qui résulte de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req := req + '"' + tag_checked[i] + '"';

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Par défaut
    Citation Envoyé par droggo Voir le message
    Comment veux-tu qu'on sache ce qui résulte de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req := req + '"' + tag_checked[i] + '"';
    La requête que j'envoie fonctionne très bien avec SQLITEMAN
    Oups, la requete que j'envoie ressemble à ceci :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM "tag" WHERE "Tag_name"="tintin"

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bonsoir,

    Si "tintin" est une chaîne de caractères, ne devrait-il pas être encadré que de simples cotes. (doublées dans le texte en Pascal=>+'''' et non +'"')

    André

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Par défaut
    En mode SELECT je passe ma requête avec les guillemets (")
    Cela fonctionne impeccable. C'est pourquoi je me disait qu'en mode DELETE je pouvais aussi utiliser les guillemets.

    J'ai quand même essayé ma requête DELETE les simples quotes comme vous me l'avez conseillé ; cela ne change rien.

    Je ne sais pas si mon problème provient de ma requête DELETE (qui fonctionne quand je la passe en manuel dans SQLITEMAN) ou si j'ai oublié une instruction quelconque avant et/ou après EXECSQL.

    NB : Lorsque je passe la requête DELETE avec les simples quotes dans SQLITEMAN, il me retourne REQUÊTE OK sans pour autant supprimer l'enregistrement. Et avec les guillemets, REQUETE OK avec la suppression de l'enregistrement.

    Par désespoir, je regarde du coté des transactions.
    Je suis complètement bloqué

  6. #6
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut
    Bonjour

    Lorsque j'ai commencé a faire du dev SQL avec lazarus, je rajoutais moi aussi les double quote à la main, et très souvent mes requêtes n’aboutissaient pas.

    C'est alors que la lumière m'est apparue dans un exemple avec la fonction QuotedStr() qui te retourne la chaine entourée de simple quote pour formater tes requêtes correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req := req + QuotedStr(tag_checked[i]);
    Ce qui au final donnerait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM tag WHERE tag_name='tintin'
    sans les double quote autour des champs et nom de table

    bon courage

  7. #7
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autriche

    Informations professionnelles :
    Activité : retraité
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Par défaut
    Bonjour,

    Le code ci-joint fonctionne chez moi sans problème.
    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
     
    procedure TForm1.EffaceEnregistrement (NomTable : String ; ValCle : integer ) ;
    Var
    SQLQ_Tmp : TZQuery ;
    begin
       SQLQ_Tmp := TZQuery.Create(self);
       try
       SQLQ_Tmp.connection := ZConnection1 ;
     
       SQLQ_Tmp.SQL.Clear;
       SQLQ_Tmp.SQL.add('delete from ' + NomTable + ' where num = ' + IntToStr(ValCle )) ;
       SQLQ_Tmp.ExecSQL;
       finally
       SQLQ_Tmp.Free;
       end;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     
       // carnet est le nom de la table SQLite, 5 est la valeur de la clé de l'enregistrement à supprimer
       EffaceEnregistrement ('carnet' , 5 );
       ZTable1.Active:= false;
       ZTable1.Active := true ; // rafaichissement de l'affichage
     
    end;
    J'ai lu dans le fil que ta base n'est pas indexée, ce genre de blocage, j'ai déjà eu et cela m'avait couté quelques heures de travail.
    Essaye en créant une clé primaire.

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Par défaut
    Bonjour

    je cite le Lazarus Database Tutorial

    par Luiz Américo

    Aller sur la page d'accueil sqlite pour plus d'information .
    Introduction

    TSqliteDataset et TSqlite3Dataset sont des descendants de TDataset qui accède , respectivement , aux bases de données sqlite version 2.8.x et 3.2.x. Ci-dessous une liste des principaux avantages et inconvénients :

    Avantages :

    Flexible : les programmeurs peuvent choisir d'employer ou de ne pas employer la langue de SQL , leur permettant de travailler avec les dispositions simples de table ou n'importe quelle disposition complexe que SQL/sqlite permet
    Mise à jour automatique de la base de données : aucun besoin de mettre à jour manuellement la base de données avec des instructions SQL, une méthode simple s'occupe de ça
    Rapide : il cache les données en mémoire, rendant la navigation dans le jeux de données rapide
    Aucune installation/configuration de serveur : just ship together with sqlite dynamic library
    Pour l'instant les "Pro" des SGBD (je pense surtout à Philippe), je n'ai pas vu une ligne de code sécurisé dans vos exemples (mise à part l'exemple n°3 de code de Sergio)

    Qu'est ce vous faites en cas d'accès concurrent ? sur un problème d'un simple DELETE ? apportez vos lumières......

    Je n'ai pas vu une seule ligne de code concernant cela ?

    Éclairez ma lanterne, Je ne demande qu'a voir la lumière et la lire le code des "Pro" (surtout Philippe)

    Jazz

  9. #9
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Citation Envoyé par Jazz77 Voir le message
    Pour l'instant les "Pro" des SGBD (je pense surtout à Philippe), je n'ai pas vu une ligne de code sécurisé dans vos exemples (mise à part l'exemple n°3 de code de Sergio)
    Si vous n'avez pas compris qu'il est préférable d'envoyer une seule requête "DELETE ..." à un SGBD plutôt qu'ouvrir une table côté application, charger toutes ses lignes en mémoire (double emploi avec ce que fait Sqlite entre autres), les parcourir puis supprimer celles qui correspondront à vos critères (ce qui génère une commande supplémentaire auprès du SGBD), cela montre que vous ne connaissez pas le fonctionnement d'un SGBD et va à l'encontre de ce que vos propos antérieurs.
    Citation Envoyé par Jazz77 Voir le message
    J'ai toujours entendu qu'il fallait éviter de complexifier du code inutilement et qu'il faut faire simple quand cela est préférable.
    Citation Envoyé par Jazz77 Voir le message
    Qu'est ce vous faites en cas d'accès concurrent ? sur un problème d'un simple DELETE ? apportez vos lumières......
    C'est là qu'interviennent les transactions et leur niveau d'isolation (du plus faible "lecture sale" ou "dirty-read" au plus élevé "sérialisé") et ce que vous faites dans les traitements transactionnés.
    Citation Envoyé par Jazz77 Voir le message
    Je n'ai pas vu une seule ligne de code concernant cela ?
    Regardez mieux...
    Citation Envoyé par Jazz77 Voir le message
    Éclairez ma lanterne, Je ne demande qu'a voir la lumière et la lire le code des "Pro" (surtout Philippe)
    Encore faudrait-il que vous compreniez les bases du sujet...

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Encore faudrait-il que vous compreniez les bases du sujet...
    En gros Philippe ...... vous venez sur le forum, vous sortez votre pseudo savoir pour casser les autres ......

    Cependant j'ai trouvé le fil de la discussion très intéressante .
    Je n'avais peut être pas vu comme l'a souligné Sergio les utilisations possibles des bases locales sur tous les angles en cas de multiple session utilisateurs.

    Je vais essayer de me documenter sur la bonne utilisation des SGBD.

    Mais tant de code pour un simple delete, cela m'ennuie un peu quand même si c'est la seule solution.

    Jazz

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

Discussions similaires

  1. Requête SQL qui ne fonctionne pas
    Par Soulama dans le forum Groovy
    Réponses: 1
    Dernier message: 25/04/2016, 03h49
  2. Interbase requête SQL qui ne fonctionne pas
    Par colorid dans le forum InterBase
    Réponses: 6
    Dernier message: 20/11/2007, 17h36
  3. requête match qui ne fonctionne pas.
    Par sam01 dans le forum Requêtes
    Réponses: 3
    Dernier message: 29/05/2006, 20h28
  4. [MySQL] Requête update qui ne fonctionne pas
    Par Sylvain245 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/12/2005, 16h40
  5. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10

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