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 :

Ajout d'un enregistrement dans une base MySQL [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 269
    Points : 2 457
    Points
    2 457
    Par défaut Ajout d'un enregistrement dans une base MySQL
    Bonjour à tous

    À titre d'essai, j'ai créé une petite application de base de données sous Lazarus qui se connecte à une base (d'une seule table !) sous MySQL.
    Tout fonctionne, sauf l'ajout d'un enregistrement (encore que je n'ai pas encore essayé la suppression).
    Avec la barre d'outils par défaut, de type TBDNavigator, rien ne se passe.
    Avec un bouton 'Ajout', l'insertion se fait... à l'arrêt de l'application ! Et encore : après le message 'Operation cannot be performed on an inactive database', quand l'instruction 'ApplyUpdates' est active (si je la commente, le message d'erreur n'apparaît pas, mais l'ajout se fait quand même après fermeture de l'application).
    Il va de soi que la connexion est faite à partir des composants de Lazarus pour MySQL.

    Voici le code de mon ajout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TFntrPrinc.BtnAjoutClick(Sender: TObject);
     
    var texte:string;
     
    begin
        Texte:='insert into `TPrinc` values(NULL,'+QuotedStr(EdPrenom.text)+','+QuotedStr(EdNom.Text)+','+EdAge.Text+','+quotedstr(edcomment.Text)+');';
        RqSQL.SQL.Text:=texte;
        EtqTest.Caption:=texte;
        rqsql.ExecSQL;
        transactionsql.Commit;
        rqsql.ApplyUpdates();
    end;
    NOTA BENE : la table est indexée sur un index auto-incrémenté.

    Quelqu'un a-t-il une idée géniale à me proposer ?

    D'avance, merci pour vos contributions.

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 068
    Points : 9 509
    Points
    9 509
    Par défaut
    hello,
    d'après ce que j'ai pu voir le ApplyUpdates doit être fait avant le Commit :
    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
    procedure Tform1.SaveChanges;
    // Saves edits done by user, if any.
    begin
      try
        if SQLTransaction1.Active then
        // Only if we are within a started transaction;
        // otherwise you get "Operation cannot be performed on an inactive dataset"
        begin
          SQLQuery1.ApplyUpdates; //Pass user-generated changes back to database...
          SQLTransaction1.Commit; //... and commit them using the transaction.
          //SQLTransaction1.Active now is false
        end;
      except
      on E: EDatabaseError do
        begin
          MessageDlg('Error', 'A database error has occurred. Technical error message: ' +
            E.Message, mtError, [mbOK], 0);
          Edit1.Text := '';
        end;
      end;
    end;
    Ami calmant, J.P

  3. #3
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 269
    Points : 2 457
    Points
    2 457
    Par défaut
    Merci beaucoup pour ce tuyau... qui ne résout pas mon problème, hélas.
    Et ça m'ajoute un message d'erreur sur la syntaxe de la requête SQL.
    Pourtant, l'insertion se fait toujours exclusivement à la fermeture de l'application. Et si elle se fait c'est que la syntaxe n'est pas si moisie, non ?

    Bonne journée.

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 068
    Points : 9 509
    Points
    9 509
    Par défaut
    hello,
    pour y voir plus clair , il faudrait nous dire quels composants tu utilises ( Zeos ? TSQLQuery, TSQLTransaction, TMySQLxxConnection ? Autre ? ) ainsi que l'O.S et la version de Lazarus.
    Ou alors mettre en pièce jointe les fichiers sources ( .pas , .frm etc ...)

    Ami calmant, J.P

  5. #5
    Membre du Club
    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
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    Je confirme ce que dit Jurassik Pork, il faudrait savoir quels composants tu utilises.

    D'une manière générale il faut que le dataSet soit en mode Edit avant de vouloir modifier/insérer/supprimer des valeurs.

    Michel.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 248
    Points : 538
    Points
    538
    Par défaut
    Bonjour,

    J'avoue avoir bien du mal à comprendre l'utilisation fréquente du mot "Dataset" que je traduis comme "jeu de données". Aussi je serai heureux que "les spécialistes" y apportent quelques précisions et me corrigent éventuellement.
    Pratiquant Firebird plutôt que MySQL, je prendrais comme exemples les composants IBExpress dont une version existe pour Lazarus. Mais il me semble que l'utilisation d'autres composants pour MySQL ou une autre base SQL doit être similaire.
    Le composant TIBSQL est le composant requête élémentaire.
    On peut avec lui exécuter une requête du type "Select" retournant un jeu de données comme résultat. On peut donc dire que dans ce cas c'est un dataset, même si on ne peut le lire que du début à la fin sans pouvoir y connecter des champs de type DB. Il n'est pas orienté données.
    Mais lorsqu'on exécute une requête du type "Insert" ou "Update" il ne retourne aucun jeu de données. Peux-t-on encore parler de dataset?
    Le composant TIBQuery est similaire au précédent avec la caractéristique d'être orienté données, donc de pouvoir être raccordé à des champs DB par l'intermédiaire d'un DataSource si on exécute une requête "Select". C'est dans ce cas un dataset. Mais ça ne l'est plus si on y exécute une requête "Insert". S'il est utilisé comme dataset, on peut le compléter par un TIBUpdateSQL qui comprend les requêtes TIBSQL nécessaires pour faire les mises à jour. Dans ce dernier cas uniquement il faut le mettre en mode "Edit" pour effectuer des modifications dans les enregistrements du dataset, sans oublier le Post s'il n'est pas fait automatiquement.
    Le composant TIBTable est toujours un dataset puisqu'il est connecté à une table.
    Il me semble que dans l'exemple de ALT pour MySQL qui utilise la logique du SQL comme Firebird on doit:
    Définir une connexion puis l'ouvrir,
    Définir une transaction puis la démarrer.
    Définir une requête utilisant la connexion et la transaction précédentes.
    Exécuter la requête "Insert" (La modification n'étant pas faite dans un dataset, le mode "Edit" n'existe pas).
    Enregistrer définitivement le résultat de la requête par un commit de la transaction (ou un commitretaining si on veut continuer).
    Fermer la connexion avant de quitter.

    André

  7. #7
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Quelques précisions sur le dernier message d'alanglet.

    Le terme de Dataset est très ancien, il était déjà utilisé dans Delphi (et autres) il y a 20 ans...
    Lazarus et beaucoup d'autres middlewares l'ont repris pour être compatible, et parce qu'il est plutôt fécond.

    Effectivement, il très général, et peut être utilisé pour des requêtes, aussi bien SELECT que INSERT ou UPDATE ou DELETE, mais aussi pour des Procédures et des fonctions stockées, et aussi pour accéder directement à des TTable (Historiquement avec le BDE de Delphi, ou avec ZeosLib, IBExpress et bien d'autres). Et, oui, il y a des cas où aucun champ n'est retourné, mais ça n'est pas bien gênant. Pour appeler du code SQL qui ne retourne pas de données on utilise souvent un type objet dérivé dans lequel les champs ne sont pas des propriétés visibles ou publiques.

    Juste un détail : un dataset est forcément orienté données, c'est même une tautologie...
    Ce terme concerne plutôt les composants visuels, certains le sont (TDbEdit) et d'autres ne le sont pas (TEdit).

    Et pour la question de ALT, je ne connais pas bien Interbase, mais je crois qu'on peut oublier ApplyUpdates qui ne sert que dans des cas particuliers (en tous cas sous MySql ou PgSql pour moi). S'il y a dans IBExpress, comme ailleurs, un mode automatique de gestion des transactions, on peut l'activer mais seulement pour des usages simples. Sinon Il faut bien gérer les transactions, les ouvrir et les fermer respectivement juste avant et juste après les requêtes de mise à jour.


  8. #8
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 269
    Points : 2 457
    Points
    2 457
    Par défaut
    Bonjour à tous

    Comme je l'avais écrit dans mon message initial, j'utilise les composants de base de Lazarus pour MySQL : TMySQL55Connection, TSQLTransaction, TDataSource & TSQLQuery.
    Je suis sous Debian 8, MySQL 5.5 & Lazarus 1.2.4+dfsg2-1.
    Détail amusant : si je supprime l'ApplyUpdate(), la grille de données (TStringGrid) se vide complètement après ajout !

    Comprenne qui pourra !

    En attendant, merci encore pour vos idées.

  9. #9
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut
    Salut ALT

    'Operation cannot be performed on an inactive database'.
    En fait j'ai eu ce même message d'erreur et j'ai su comment l'éliminer.
    j'ai une SQLquery1 qui possède un champ persistant provenant d'une autre SQLquery2.
    J'activait manuellement les deux SQLquery,mais au moment de l'exécution ce même message apparait et l'exécution s'arrêtait.

    J'ai essayé une autre méthode

    *j'ai désactivé les deux SQLquery et ajouté le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Formcreate(Sender:TObject) //ou DataModuleCreate().
    begin
    SQLquery1.active:=True;
    SQLquery2.active:=True;
    end;
    et l'application s'ouvrait normalement sans message d'erreurs.
    En fait je ne sait pas si c'est le même cas, mais je vous propose d'essayer cette méthode.

    merci beaucoup.

  10. #10
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 269
    Points : 2 457
    Points
    2 457
    Par défaut
    Désolé : rien de tout ça n'améliore le fonctionnement de mon programme.

    Je joins donc le source (hélas, les fichiers *.lpr, *.res... ne passent pas) pour que vous puissiez y déceler mon éventuelle erreur.

    À nouveau merci pour vos contributions.
    Fichiers attachés Fichiers attachés

  11. #11
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 068
    Points : 9 509
    Points
    9 509
    Par défaut
    hello,
    bon j'ai créé une petite base mysql (en 5.0 ) :
    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
    -- Database: `test_personnes`
    -- --------------------------------------------------------
    -- Table structure for table `personnes`
     
    CREATE TABLE IF NOT EXISTS `personnes` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(30) NOT NULL,
      `prenom` varchar(25) NOT NULL,
      `age` int(11) NOT NULL,
      `commentaire` text NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
     
    -- Dumping data for table `personnes`
     
    INSERT INTO `personnes` (`id`, `nom`, `prenom`, `age`, `commentaire`) VALUES
    (1, 'Tairieur', 'Alain', 30, 'c''est moi Alain'),
    (2, 'Tairieur', 'Alex', 35, 'C''est moi ALex \r\ntest accents UTF8 é ç à');
    en utilisant les composants TSqlQuery , TSqlTransaction, TMySQL50Connection, TDataSource avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    var texte:string;
    begin
        Texte:='insert into `personnes` values(NULL,'+QuotedStr('Manvusat')+','+QuotedStr('Gérard')+','+'40'+','+quotedstr('commentaire')+');';
        SQLQuery1.SQL.Text:=texte;
        ShowMessage(texte); (** affichage de la requête réellement envoyée à MySQL **)
        SQLQuery1.Active:=true;
        SQLQuery1.ExecSQL;
        SQLQuery1.ApplyUpdates();
        SQLTransaction1.Commit;
    end;
    L'enregistrement est bien ajouté après le clic sur le bouton.
    Alors une erreur de paramètrage des composants ? Dans ce cas il faut que l'on voit tous tes fichiers ( à mettre dans un zip).

    Ami calmant, J.P

  12. #12
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 269
    Points : 2 457
    Points
    2 457
    Par défaut
    Voici les autres fichiers.

    Encore merci à tous !
    Fichiers attachés Fichiers attachés

  13. #13
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 068
    Points : 9 509
    Points
    9 509
    Par défaut
    hello

    arf dans ton zip il n'y a pas tout ( le .lfm par exemple) et dans ton projet il y a une dépendance avec le composant zcomponent ( késako ? )

  14. #14
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 269
    Points : 2 457
    Points
    2 457
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello

    arf dans ton zip il n'y a pas tout ( le .lfm par exemple) et dans ton projet il y a une dépendance avec le composant zcomponent ( késako ? )
    Effectivement, je l'ai oublié, celui-ci (le .lfm, bien sûr ! ). Erreur réparée.
    Pour le zcompotruc, je suppose que c'est un résidu d'essai des outils Zeos. Sinon, je ne sais pas d'où ça vient.

    Bon après-midi.
    Fichiers attachés Fichiers attachés

  15. #15
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 068
    Points : 9 509
    Points
    9 509
    Par défaut
    hello,
    tu as dit :

    Avec la barre d'outils par défaut, de type TBDNavigator, rien ne se passe.
    moi j'arrive à la faire fonctionner moyennant quelques corrections :
    1 - Apparemment les événements ne sont pas "câblés" sur ton composant TSqlQuery , il faut que tu ailles dans l'onglet événements de ce composant et si toutes les cases sont vides il faut que tu double cliques sur les événements que tu veux "cabler". Par exemple AfterPost.

    Pour ajouter un enregistrement par le tdbnavigator :
    1 - Appuyer sur le bouton + du tdbnavigator
    2 - Rentrer ses données.
    3 - Appuyer sur le bouton post ( le v)
    4 - Faire un refresh pour voir si cela a fonctionné et voir le id.

    L'ajout par bouton n'est pas très ergonomique , il vaut mieux se concentrer sur le tDbNavigator .

    Il faudrait aussi :
    1 dans les options du tdbnavigator ajouter les boutons cancel et delete.
    2 dans le tdbgrid mettre la propriété autofillcolumns à True.

    Nom : Alt_Mysql.png
Affichages : 791
Taille : 34,3 Ko

    Ami calmant, J.P

  16. #16
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 269
    Points : 2 457
    Points
    2 457
    Par défaut
    Salut, jurassic pork

    Merci pour tes conseils avisés : ça fonctionne !

    Super.

    Bonne journée à toi.

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

Discussions similaires

  1. [MySQL] Creation d'enregistrement dans une base MySQL
    Par BENjou dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 06/12/2013, 18h49
  2. telecharger un fichier excel et l'enregistrer dans une base MYSQL
    Par spartacus10 dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 04/05/2012, 11h33
  3. MàJ/ajout d'un enregistrement dans une base de données mySQL
    Par BMT_Benoît dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/08/2007, 08h02
  4. Réponses: 5
    Dernier message: 26/02/2007, 01h50
  5. [SQL/BDD] Ajout massif de donnees dans une base mysql
    Par tomWag dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/05/2006, 18h06

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