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 :

Ensemble de données fermé après requête SQL


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Points : 38
    Points
    38
    Par défaut Ensemble de données fermé après requête SQL
    Bonjour

    Je cherche à effacer tous les enregistrements d'une
    table nommée Table1 (qui est d'ailleurs la seule
    table de la base de donnée) d'une base donnée
    dont la chaine de connexion est dans TADOQUERY1.connectionString
    et donne une connexion valide au test.

    J'utilise ce code (en commentaire j'ai mis les différentes
    requêtes que j'ai essayées pour résoudre le problème):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      ADOQuery1.SQL.Clear;
       Form1.ADOQuery1.SQL.add('DELETE from Table1;');
       //Form1.ADOQuery1.SQL.Add('DELETE * from Table1;');
       //ADOQuery1.SQL.Add('DELETE Table1.* FROM Table1;');
       ADOQuery1.ExecSQL;
    Après son exécution qui ne donne aucune erreur et efface
    bien la table, un ADOQuery1.Insert; déclenche une exception
    stipulant qu'un essai de manipulation d'un ensemble
    de données fermé à été tenté.

    Je crois comprendre qu'il est donc passé dans l'état DsInactive
    suite à une erreur. Mais quelle erreur ?
    A signaler qu'un ADOQuery1.active:=True déclenche la même erreur
    et qu'il n'y a plus moyen de toucher aux donnés.
    Aucun forme de requête ne résout le problème (celles en commentaire)
    et là je bloque.

    Si quelqu'un a une idée, je suis preneur ...

    Cordialement

    Eric

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Essaye en enlevant le ; à la fin de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.ADOQuery1.SQL.add('DELETE from Table1;');

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    au vu de ce que tu expliques, je pense que c'est normal que cela plante.

    Les requete delete/insert/uodate ne retournent pas d'ensemble de données donc quand tu fais un ExecSQL, la requete est fermé et tu ne peux utiliser de fonction d'ajout/suppression d'enregistrement.

    en clair il faut que tu fasses comme cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    With AdoQuery1 do
    begin
      Close; // fermeture de la requete
      SQL.Clear; // suppression de la requete
      SQL.Add('Delete from table1');
      ExecSQL; // Exécution de la requete
     
      Close;  // fermeture de la requete
      SQL.Clear; // suppression de la requete
      SQL.Add('Select * from table1');
      Open; // ouverture de la table1
    end;
    A partir de ce moment tu peux utiliser les fonctions de type insert/Append/delete/edit/ etc ... comme si c'etait un TAdoTable et il faut absolument que la requete soit seulement sur une table unique (si tu as une jointure tu ne peux pas utiliser ces fonctions).
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Points : 38
    Points
    38
    Par défaut Idem
    Ok. Donc j'ai essayé avec et sans le ';' dans la requête en ajoutant
    le .close à la fin ce qui donne et qui plante de la même façon sur le .insert
    finale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       ADOQuery1.SQL.Clear;
       Form1.ADOQuery1.SQL.add('DELETE from Table1;');
       // Form1.ADOQuery1.SQL.add('DELETE from Table1');
       ADOQuery1.ExecSQL;
     
       Form1.ADOQuery1.Close;
     
       ADOQuery1.Insert; // BOUMM !

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Eric Beaumard Voir le message
    Ok. Donc j'ai essayé avec et sans le ';' dans la requête en ajoutant
    le .close à la fin ce qui donne et qui plante de la même façon sur le .insert
    finale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       ADOQuery1.SQL.Clear;
       Form1.ADOQuery1.SQL.add('DELETE from Table1;');
       // Form1.ADOQuery1.SQL.add('DELETE from Table1');
       ADOQuery1.ExecSQL;
     
       Form1.ADOQuery1.Close;
     
       ADOQuery1.Insert; // BOUMM !
    As tu lu ma remarque plus haut qui indique que ton code est faux et que c'est normal que cela ne fonctionne pas.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Points : 38
    Points
    38
    Par défaut
    Finallement je m'en suis tiré avec ça.
    Peu glorieux j'en conviens mais l'utilisation
    d'ADO me hérisse de plus en plus
    et là je n'en peux plus. 3 heures de perdues
    pour simplement deleter une table et insérer
    des trucs dedans après. Si quelqu'un connait
    des composants mieux foutus que ADO
    sous delphi 7 je suis preneur.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       Form1.ADOQuery1.Active:=True;
       Form1.ADOQuery1.Edit;
       If     Form1.ADOQuery1.RecordCount>0 then
       begin
          Form1.ADOQuery1.First;
          while not Form1.ADOQuery1.eof do
          begin
             Form1.ADOQuery1.Delete;
          end;
       end;

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Eric Beaumard Voir le message
    Finallement je m'en suis tiré avec ça.
    Peu glorieux j'en conviens mais l'utilisation
    d'ADO me hérisse de plus en plus
    et là je n'en peux plus. 3 heures de perdues
    pour simplement deleter une table et insérer
    des trucs dedans après. Si quelqu'un connait
    des composants mieux foutus que ADO
    sous delphi 7 je suis preneur.
    Je pense surtout que tu n'as pas compris comment cela fonctionne avec les composants bases de données.

    Tous les autres composants fonctionne de la même manière (BDE/ADO/DbExpress/Composants tiers)

    Quand tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    With AdoQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Delete from Table1');
      ExecSQL;
    end;
    Il est normal qu'après tu ne puisses pas faire un insert avec ce même composant vu qu'il ne pointe sur aucune table (une fonction SQL delete ne retourne aucun enregistrement/Ensemble de données)
    Donc il est nécessaire de faire après le delete, une connexion sur la table avant de vouloir faire une insertion.

    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
     
    // Suppression des données de la table
    With AdoQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Delete from Table1');
      ExecSQL; // execution de la requete de suppression
     
    // L'ensemble de données est vide
    // donc on se connecte sur la table pour faire des actions
      Close;
      SQL.Add('Select * from Table1');
      Open; // Ouverture de la conenxion avec la table1
     
      Insert; // Ajout d'une ligne dans la table
      // Initialisation des champs avec les valeurs voulus
      FieldByName('Champ1').AsString := 'MaValeurChaine';
      FieldByName('Champ2').Asinteger := 1;
      Post; // Sauvegarde de la ligne
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Points : 38
    Points
    38
    Par défaut
    Ok merci pour les explications. Je vais aller essayer. J'avais cru de prime abord
    que ce bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Close;
      SQL.Add('Select * from Table1');
      Open;
    que tu avais rajouté était simplement une façon de me faire voir ce qu'on pouvait faire après mais n'était pas nécessaire à la reconnexion de la table (le réédition d'un pointeur sur cette table). Je l'avais donc retiré et remplacé par mon INSERT.

    Quoi qu'il en soit ma colère ne décroit pas. La logique que tu décris - et qui n'est pas de toi, ne prends pas ce qui suit pour une attaque personnelle - est absurde. Quand je détruis les enregistrements d'un table, je ne détruis pas la table. Personne, intuitivement, directement, parce que cela va à l'encontre du simple bon sens ne peut comprendre qu'un TAdoQuery puisse pointer sur une table avant de détruire ses enregistrements et plus après. Une table vide est toujours une table. Bref. ADO n'a pas été pensé pour les utilisateurs mais, peut-être, pour des puristes, mais alors la copie est à revoir. ADO ne correspond pas à l'idée d'un RAD. Dans un RAD je dois pouvoir détruire les enregistrements d'une table avec une requête SQL sans perdre mon pointeur sur cette table parce que c'est contre-intuitif et contre-productif.

    Cordialement

    Eric

  9. #9
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Points : 38
    Points
    38
    Par défaut
    Bon ça marche et je te remercie. Par contre je renouvelle ma requête pour quelque chose de plus intuitif et mieux pensé qu'ADO.

    Eric

  10. #10
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    je renouvelle ma requête pour quelque chose de plus intuitif et mieux pensé qu'ADO.
    Jette un oeil sur ce sujet; @aityahia y donne des liens à ce propos...
    De retour parmis vous après 10 ans!!

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Eric Beaumard Voir le message
    Bon ça marche et je te remercie. Par contre je renouvelle ma requête pour quelque chose de plus intuitif et mieux pensé qu'ADO.

    Eric
    Je pense que tu ne trouveras pas mieux, c'est le fonctionnement du SQL et pas d'ADO qu'il faut remettre en cause.
    Une requete Delete ne retourne jamais d'ensemble de données (idem avec insert et update), ensemble qui est nécessaire si tu veux pouvoir utiliser la fonction Insert du TAdoQuery.

    Que tu utilises le BDE, DBExpress ou d'autres composants tiers, ca fonctionnera de la même manière.

    Sinon en général il est préférable de travailler sur 2 requetes :
    - Une pointant sur la table (Ex : AdoQMainTable -> select * from table1)
    - une servant à faire les actions (Ex : AdoQActions -> Insert/delete/update)

    et de rafraichir seulement la première (AdoQMainTable.Requery) après qu'une action soit faite.

    PS: Si tu n'as plus de question pense à cliquer sur
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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

Discussions similaires

  1. Erreur de lecture de données dans une requête SQL
    Par PtiteDéveloppeuse dans le forum Requêtes
    Réponses: 0
    Dernier message: 10/01/2008, 11h29
  2. Réponses: 6
    Dernier message: 24/01/2007, 12h16
  3. [Débutant] ClassCastException après requête SQL
    Par tck-lt dans le forum Hibernate
    Réponses: 10
    Dernier message: 06/12/2006, 16h18
  4. Réponses: 1
    Dernier message: 25/08/2006, 14h21
  5. ensemble de données fermées...
    Par vasaldo dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/06/2004, 16h58

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