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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    ALT
    ALT est déconnecté
    Membre Expert
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 373
    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 373
    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 confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 219
    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 Expert
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 373
    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 373
    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 confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 219
    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 é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,

    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 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
    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é

+ 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