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

  1. #21
    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

  2. #22
    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...

  3. #23
    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

  4. #24
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Pour revenir calmement au sujet, j'utilise
    • les transactions quand j'émets plusieurs requêtes liées. Par exemple, ajout d'une facture et de ses lignes. Si toutes les requêtes d'INSERT ou d'UPDATE nécessaires à l'enregistrement de la facture ne provoquent pas d'erreur, alors on "commite" sinon, on "roolbacke". Ainsi tout est écrit ou rien.
    • les verrous de ligne quand c'est possible (OK en PostgreSQL, mySQL innoDB mais pas en mySQL MYISAM)... et en fonction des besoins


    Evidemment si on bénéficie dans la base de la gestion des Doublons, des Contraintes... c'est un énorme plus dont il ne faut pas se priver.

    Maintenant, la manière de développer avec Lazarus dépend des connecteurs utilisés, des bases utilisées... Par exemple jusqu'à la version 9.30, les connecteurs natifs manquaient de précision avec PostgreSQL. Ils constataient l'erreur mais n'étaient pas capables de fournir leur numéro... Lors d'une modification un refus pouvait être un Doublon ou un Blocage... ce qui obligeait à des contorsions pour savoir... Il faut s'adapter aux réalités des versions de Lazarus.

    Enfin, il y a l'utilisation de la base. On peut gérer les accès concurrentiels de diverses manières de par la demande des utilisateurs... en coopératif, en exclusif... ou en force : c'est le dernier qui a raison

    Dernier point, j'allais oublier : si cela n'a pas changé, SQLite n'est vraiment pas adapté pour faire de l'accès concurrentiel... et pour ne pas ouvrir 2 fois le même programme à partir d'un même poste http://wiki.freepascal.org/UniqueInstance/fr

    En conclusion, je ne crois pas qu'il y ait une méthode générale à appliquer systématiquement. Il y a probablement une meilleure façon, c'est à dire mieux adaptée à la situation que l'on rencontre. Je me méfie énormément des lieux communs et j'apprécie tout autant les approches autodidactes , raisonnées et expérimentées : si je vous dis qu'en mySQL je n'utilisais pas les DataSource... et d'ailleurs pas non plus maintenant en PostgreSQL, que dbExpress m'a semblé inepte, que j'ai pris Zeos à la place, que j'ai abandonné pour les natifs en Lazarus et qu'en Delphi je n'hésiterais pas à choisir AnyDAc enfin FireDac* (jusqu'en février ce n'était pas le discours officiel)... Je peux expliquer mes choix à chaque fois même s'ils paraissent déroger à cette chère orthodoxie.

    A bientôt. Gilles

    PS : Je n'aime pas trop l'utilisation des QuotedStr. Je préfère (ce n'est pas supérieur, mais plus souple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    req := 'INSERT INTO tags (Tag_name) VALUES (:paStr);';
    Params.ParamByName('paStr').AsString := 'xxxx';
    *c'est une excellente nouvelle et ouvre plein de perspectives...
    Dernière modification par Invité ; 17/03/2013 à 21h56.

  5. #25
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Par défaut
    Quelle discussion intéressante
    Citation Envoyé par Ph. B. Voir le message
    D'autre part, le composant TSQLQuery ne peut se passer d'un composant TSQLTransaction.
    Désormais, et hormis les requêtes de type SELECT, j'encadrerais tous les autres types de requêtes par des transactions. Et le moins de quotes possible.

    Requete SELECT (sans quotes) :
    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 plugins
      IHM_FenetrePrincipale.IHM_DbSqliteQuery.SQL.Add('SELECT DISTINCT Nom FROM plugins ORDER BY Nom ASC');
      IHM_FenetrePrincipale.IHM_DbSqliteQuery.ExecSQL;
      IHM_FenetrePrincipale.IHM_DbSqliteQuery.Active:= true;
     
      // Ajout des noms dans le cheklistbox
      while not IHM_FenetrePrincipale.IHM_DbSqliteQuery.EOF do
      begin
        IHM_FenetrePrincipale.IHM_ChklistboxNoms.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;
    Requête INSERT (et DELETE) (quotes obligatoires sinon elle passe pas !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      // Ajout du tag dans la base de données tag
      req := 'INSERT INTO tags (Tag_name) VALUES (' + QuotedStr(str) + ')';
      // 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.ExecSQL;
      IHM_FenetrePrincipale.IHM_DbSqliteTransaction.Commit;
      // Fermeture de la base de données
      IHM_FenetrePrincipale.IHM_DbSqliteConnection.Close;
    Sujet résolu encore merci la communauté

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Requête SQL qui ne fonctionne pas
    Par Soulama dans le forum Groovy
    Réponses: 1
    Dernier message: 25/04/2016, 04h49
  2. Interbase requête SQL qui ne fonctionne pas
    Par colorid dans le forum InterBase
    Réponses: 6
    Dernier message: 20/11/2007, 18h36
  3. requête match qui ne fonctionne pas.
    Par sam01 dans le forum Requêtes
    Réponses: 3
    Dernier message: 29/05/2006, 21h28
  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, 17h40
  5. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 17h10

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