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 :

Sous-débutant en base de données


Sujet :

Lazarus Pascal

  1. #1
    Membre éclairé
    Sous-débutant en base de données
    Bonjour à toutes et à tous,

    Ne m'y étant jamais intéressé et y étant complètement nul, je me lance dans une base de données SqLite. j'essaie de bâtir un petit exemple basé sur ceci.

    J'ai réussi à créer la base (je vois sa structure avec l'application "DB Browser SqLite"), mais je n'arrive pas à y entrer de données. Voici mon petit programme :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    unit FntrBase;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, sqlite3conn, sqldb, Forms, Controls, Graphics, Dialogs;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        SQLite3Connection: TSQLite3Connection;
        SQLQuery: TSQLQuery;
        SQLTransaction: TSQLTransaction;
        procedure FormCreate(Sender: TObject);
      private
     
      public
        procedure NewEmploye(V1, V2, V3, V4: String);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     
      if FileExists('Employes.db') then  // Je recrée la base à chaque lancement
        if not DeleteFile('Employes.db') then
        begin
          ShowMessage('Pas supprimé !');
          Exit;
        end;
     
      SQLite3Connection.DatabaseName:= 'Employes.db';
      SQLite3Connection.Open;
      SQLTransaction.Active:= True;
     
      SQLite3Connection.ExecuteDirect('CREATE TABLE CUSTOMER('+
      'CUST_NO INTEGER NOT NULL,'+
      'CUSTOMER VARCHAR(25) NOT NULL,'+
      'CITY VARCHAR(25),'+
      'COUNTRY VARCHAR(15),'+
      'CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO));');
      SQLTransaction.Commit; // Jusque là, ça marche ; la base est enregistrée
      NewEmploye('1', 'Lapinou logiciel', 'Lanion', 'France'); // Ici, ça plante
    end;
     
    procedure TForm1.NewEmploye(V1, V2, V3, V4: String);
    begin
      SQLQuery.SQL.Text:= 'INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('+V1+','+V2+','+V3+','+V4+');';
      SQLQuery.ExecSQL;
      SQLTransaction.Commit;
    end;
     
    end.


    A l'exécution de la ligne "NewEmploye", j'ai l'erreur suivante :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    La projet TestSqL a levé une classe d’exception "ESQLDataBaseError avec les message :
    SQLLite3Connexion : near" logiciel" : syntaxe error


    Je pense que ce doit être d'une trivialité basique pour qui a joué un peu avec les bases, mais pour moi ...

    Cordialement.

    Pierre

  2. #2
    Membre éclairé
    Bonjour,

    Parce que il te faut utiliser des quotedStr pour les chaînes

    Ta requête se traduit ainsi :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (1, Lapinou logiciel, Lanion, France)


    Donc normal que SQLITE te renvoie une erreur de syntaxe du côté de Lapinou....

    De mon point de vue tu devrais plutôt regarder du côté des requêtes paramétrées (que je ne maîtrise pas avec les SQLQUERies) car je travaille directement sur l'interface SQLITE.

    Cordialement

  3. #3
    Membre éclairé
    En essayant de comprendre et à l'aide de l'exemple, j'arrive à ces deux formes qui fonctionnent :

    1- Accès direct :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SQLQuery.SQL.Text:= 'INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (4, ''Felipe Bank'', ''Manchester'', ''England'')';
      SQLQuery.ExecSQL;
      SQLTransaction.Commit;
    end;


    Accès via une procédure :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NewEmploye(5, 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');
     
    procedure TForm1.NewEmploye(V1: Integer; V2, V3, V4: String);
    begin
      SQLQuery.SQL.Text:= 'INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('+IntTostr(V1)+','+AnsiQuotedStr(V2, '''')+','+AnsiQuotedStr(V3, '''')+','+AnsiQuotedStr(V4, '''')+');';
      SQLQuery.ExecSQL;
      SQLTransaction.Commit;
    end;


    Je vais essayer avec les ParamByName ...

    Cordialement.

    Pierre.

  4. #4
    Membre éclairé
    j'ai créé cette procédure :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.NewEmploye(V1: Integer; V2, V3, V4: String);
    begin
    '+IntTostr(V1)+','+AnsiQuotedStr(V2, '''')+','+AnsiQuotedStr(V3, '''')+','+AnsiQuotedStr(V4, '''')+');';
      SQLQuery.Params.ParamByName('CUST_NO').AsInteger:= V1;
      SQLQuery.Params.ParamByName('CUSTOMER').AsString:= V2;
      SQLQuery.Params.ParamByName('CITY').AsString:= V3;
      SQLQuery.Params.ParamByName('COUNTRY').AsString:= V4;
     
      SQLQuery.ExecSQL;
      SQLTransaction.Commit;
    end;


    Mais à l'exécution, il m'est dit que les paramètres 'CUST_NO', 'CUSTOMER', ... ne sont pas trouvés. Je dois certainement faire encore une faute de syntaxe.

    Cordialement.

    Pierre

  5. #5
    Membre éclairé
    Regarde ici https://lazarus.developpez.com/cours/databases/acces-natifs/

    Tu y trouveras ce qu'il faut pour tes paramètres...

  6. #6
    Membre expert
    Salut tu dois modifier ta requête SQL cf Ici la suite du 1er tuto que tu as mentionné.

    Tu dois rajouter ":" pour les paramètres. Ta requête SQL devrait ressembler à quelques chose comme ça

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (:CUST_NO, :CUSTOMER, :CITY, :COUNTRY)


    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Membre éclairé
    Merci "acaumes" et "Beanzmaster". J'ai effectivement découvert hier au soir ce "formatage".

    Je vais essayer de continuer, mais franchement, plutôt que d'utiliser cette syntaxe "exotique" pour gérer une petite centaine de tables ayant chacune un petit millier de données (gestion de portefeuille par exemple), cela se fait très simplement avec des fichiers texte, des "record" et les insertions, tris, ... avec des "if" et des "case" qui vont bien.

    Bon, allez, continuons.

    Cordialement.

    Pierre

  8. #8
    Membre expert
    Salut Pierre, si jamais tu peux aussi lire les excellents billets de tourlourou sur son blog sur le sujet surtout le 3ème et le 4ème. J'aime beaucoup cette façon de faire

    A+
    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP