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 :

Update/Delete/Insert avec TPQConnection ne semble pas fonctionner [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2009
    Messages : 34
    Points : 59
    Points
    59
    Par défaut Update/Delete/Insert avec TPQConnection ne semble pas fonctionner
    Bonjour,
    Mon souci est que j'arrive à récupérer et à afficher les données depuis une base de données PostgreSQL mais pas à les modifier. Voici le code utilisé :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    procedure TMainForm.BtTestClick( Sender : TObject) ;
    var
      _SQLCon    : TPQConnection;
      _SQLTrs     : TSQLTransaction;
      _SQLQuery : TSQLQuery;
      tampon      : String;
    begin
      // Initialise la connection
      _SQLCon    := TPQConnection.Create(nil);
      _SQLCon.DatabaseName := 'DB_MOSAIC';
      _SQLCon.HostName     := '192.168.0.12';         <----- Acces distant autorisé
      _SQLCon.UserName     := 'postgres';
      _SQLCon.Password     :=  'motdepasse';
      //Ouvre la connection
      try
        _SQLCon.Connected := True;
      except
        on e:EDatabaseError do begin
          Erreur('Connection impossible.'+#13#10+e.Message);
          _SQLCon.Free;
          exit;
        end;
      end;
     
      // Lier les objets
      _SQLTrs          := TSQLTransaction.Create(_SQLCon);   <------ Cela est il permis?
      _SQLTrs.DataBase := _SQLCon;
     
      _SQLQuery             := TSQLQuery.Create(_SQLCon);    <------ Cela est il permis?
      _SQLQuery.DataBase    := _SQLCon;
      _SQLQuery.Transaction := _SQLTrs;
     
      // Injecte et execute la requete SQL
      try
        _SQLCon.ExecuteDirect('insert into bpartner(bprnum, bprnam) values(''SALIM'',''TEST Lazarus'');');
      except
        on e:EDatabaseError do begin
          Erreur('Erreur reqête SQL.'+#13#10+e.Message);
          _SQLCon.Free;
          exit;
        end;
      end;
     
      _SQLCon.Free;
    end;
    Le code me semble bon car il fonctionne sur une BDD MySQL. Je dois sans doute avoir loupé quelque chose.

    OS : Linux 3.2.0-4-686-pae #1 SMP Debian 3.2.54-2 i686 GNU/Linux
    Lazarus : Version 1.2.0
    PostgreSQL : Version 9.1.1.2

    La structure de table a été simplifiée pour les besoins du test :
    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
     
    -- Table: bpartner
     
    -- DROP TABLE bpartner;
     
    CREATE TABLE bpartner
    (
      bprnum character varying(10) NOT NULL,
      bprnam character(35) NOT NULL,
      CONSTRAINT pkd_bpartner PRIMARY KEY (bprnum )
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE bpartner
      OWNER TO postgres;
    GRANT ALL ON TABLE bpartner TO postgres WITH GRANT OPTION;
    Je préfère utiliser PosqtgreSQL mais sinon je me rabattrais sur MySQL. Mais j'aimerais bien savoir ce qui se passe.

    Merci à tous.
    Salim

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2009
    Messages : 34
    Points : 59
    Points
    59
    Par défaut
    Re-bonjour,
    J'ai passé toute la journée d'hier sans trouver de réponse. Je poste et 5 min plus tard, je trouve la réponse sur un autre forum (http://en.it-usenet.org/thread/13232/386/) où quelqu’un avait le problème inverse en passant de PostgreSQL à SQLite qui n'acceptait pas les commit sans transactions.
    Avec PostgreSQL, il faut faire un commit après la requête d'insertion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        _SQLCon.ExecuteDirect('insert into bpartner(bprnum, bprnam) values(''SALIM'',''TEST Lazarus'');');
        _SQLCon.ExecuteDirect('commit');
    A toute fin utile.
    Bon courage à tous.
    Salim.

  3. #3
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    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,

    Je crois que ce n'est pas directement lié à PGSql mais plutôt parce que tu as un démarrage de transaction implicite.
    Si, pour voir, tu fais un SELECT après l'INSERT je parie que tu retrouves les données insérées.

    Peut-être est-ce une propriété par défaut de TPQConnection ? Si oui, c'est fâcheux.
    Avec ZEOS je n'ai jamais rencontré ce problème.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par tintinux Voir le message
    Peut-être est-ce une propriété par défaut de TPQConnection ? Si oui, c'est fâcheux.
    Avec ZEOS je n'ai jamais rencontré ce problème.
    Eh bien non, ce n'est pas fâcheux !
    Ce qui est fâcheux, c'est que les développeurs ignorent bien souvent le concept de transaction, s'habituent à des composants qui autocommitent leurs actions et après s'interrogent sur un fonctionnement soi-disant innattendu...
    Et puis un petit coup d’œil aux documentations existantes ne peut pas faire de mal : How to execute direct queries/make a table?

    Ensuite, pour la demande relative au création de composants, oui, cela est permis. Lors de la libération de _SQLCon, tous les objets qui lui sont rattachés seront également libérés.
    J'aurais peut-être écrit le code différemment :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    procedure TMainForm.BtTestClick( Sender : TObject) ;
    var
      _SQLCon   : TPQConnection;
      _SQLTrs   : TSQLTransaction;
      _SQLQuery : TSQLQuery;
      tampon    : String;
    begin
      // Initialise la connexion
      _SQLCon    := TPQConnection.Create(nil);
      try
        _SQLCon.DatabaseName := 'DB_MOSAIC';
        _SQLCon.HostName     := '192.168.0.12';
        _SQLCon.UserName     := 'postgres';
        _SQLCon.Password     :=  'motdepasse';
        //Ouvre la connexion
        try
          _SQLCon.Connected := True;
        except
          on e:EDatabaseError do begin
            Erreur('Connexion impossible.'+#13#10+e.Message);
            exit;
          end;
        end;
     
        // Lier les objets
        _SQLTrs          := TSQLTransaction.Create(_SQLCon);
        _SQLTrs.DataBase := _SQLCon;
     
        _SQLQuery             := TSQLQuery.Create(_SQLCon);
        _SQLQuery.DataBase    := _SQLCon;
        _SQLQuery.Transaction := _SQLTrs;
     
        // Injecte et exécute la requête SQL
        try
          _SQLCon.StartTransaction;
          _SQLCon.ExecuteDirect('insert into bpartner(bprnum, bprnam) values(''SALIM'',''TEST Lazarus'');');
          _SQLCon.Commit;
        except
          on e:EDatabaseError do begin
            Erreur('Erreur requête SQL.'+#13#10+e.Message);
            exit;
          end;
        end;
      finally 
        _SQLCon.Free;
      end;
    end;
    Philippe.

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2009
    Messages : 34
    Points : 59
    Points
    59
    Par défaut
    Merci à tous,
    Je n'aime pas non plus les composants qui font tout le boulot, mais ça permet de justement comprendre les mécanismes quand ça ne tourne pas rond et d’apprécier le travail fait main.

    @Philippe : Merci pour le code. Je l'ai appliqué au mot près. Bien noté pour "composant.create(_SQLQuery)"

    Merci à tous pour votre aide et assistance.
    Salim.

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

Discussions similaires

  1. Update or insert avec conditions sur les champs
    Par calou_33 dans le forum SQL
    Réponses: 7
    Dernier message: 04/08/2010, 11h36
  2. bgColor ne semble pas fonctionner avec IE
    Par beegees dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 07/08/2009, 16h54
  3. trigger "update sur insert" avec insertion multiple
    Par harf18 dans le forum Développement
    Réponses: 4
    Dernier message: 18/05/2009, 15h46
  4. Update,Delete & Insert
    Par Yayam dans le forum SQL
    Réponses: 7
    Dernier message: 18/12/2008, 21h23
  5. Update ou insert avec incrément d'un champ
    Par dany13 dans le forum ASP
    Réponses: 5
    Dernier message: 15/10/2004, 13h53

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