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 :

Sous-débutant en base de données


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut 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 éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 100
    Points
    1 100
    Par défaut
    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 éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    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 éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    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 éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 100
    Points
    1 100
    Par défaut
    Regarde ici https://lazarus.developpez.com/cours.../acces-natifs/

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

  6. #6
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    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 éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    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
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    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

Discussions similaires

  1. [MySQL] menu et sous menu avec base de données
    Par pp_le_moko dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/01/2010, 12h16
  2. Réponses: 2
    Dernier message: 14/01/2009, 09h48
  3. [Débutant] les bases de données pour réseau local ou monopost
    Par maximedu42 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 05/11/2007, 11h19
  4. Débutant : Applet+base de donnée
    Par mikado_O dans le forum Applets
    Réponses: 2
    Dernier message: 30/11/2006, 13h47
  5. Réponses: 9
    Dernier message: 20/08/2006, 23h43

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