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

Bases de données Delphi Discussion :

utiliser SQLite, tuto


Sujet :

Bases de données Delphi

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut utiliser SQLite, tuto
    Bonjour,

    Je suis le tuto suivant : http://mestressat.developpez.com/tut...-sqlite3-apis/
    et je ne comprends pas ce qui se passe avec l'instruction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sqlite3_prepare_v2(
              DB,                //Handle base de donnée
              PChar(sSQL),       //Requête
              -1,                //Longueur chaine SQL (-1 : autodetect)
              Stmt,              //Handle requête
              IgnoreNextStmt);   //Préparation prochaine requête
     
    // le prototype de la DLL est le suivant:
    // function sqlite3_prepare_v2(sqlite3:pointer;sql:pchar;nBytes:integer;var stmt:pointer;var ztail:pchar):integer; cdecl; external 'sqlite3.dll';

    du bloc suivant que j'ai encapsulé dans une procedure pour reutilisation


    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
     
    procedure FS_IO_sqlite_db_query (sqlite_db_path  :  string; sql_str_query  :  string);
     
       var DB              :  pointer;   // Data base Handle
           Stmt            :  pointer;   // SQL Query Handle
           IgnoreNextStmt  :  pointer;   // SQL Query Handle
     
       begin
       sqlite3_open(PChar(sqlite_db_path),DB);  // Data base opening
     
       sqlite3_prepare_v2(                      // Query preparation
              DB,                               // Data Base Handle
              PChar(sql_str_query),             // Query
              -1,                               // Length string SQL (-1 : autodetect)
              Stmt,                             // Query Handle
              IgnoreNextStmt);                  // Preparation next query
     
              sqlite3_step(Stmt);               // Query execution
     
              sqlite3_finalize(Stmt);           // Query validation
     
              sqlite3_close(DB);                // Data base closing
       end;  // FS_IO_sqlite_db_query
    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
     
    // Juste pour mémoire, ceci est le code de la requête.
    // Elle est en principe OK, car je l'ai testée aver sqlite manager
     
          str_sql := 'CREATE TABLE flight_schedule_table ([ID] INTEGER PRIMARY KEY  NOT NULL  UNIQUE, '
                                                       + '[FLIGHT_ID] INTEGER NOT NULL, '
                                                       + '[FLIGHT_CD] VARCHAR NOT NULL, '
                                                       + '[AIRPORT_DEPARTURE] VARCHAR NOT NULL, '
                                                       + '[AIRPORT_ARRIVAL] VARCHAR NOT NULL, '
                                                       + '[LOCAL_TIME_DEPARTURE] INTEGER NOT NULL, '
                                                       + '[LOCAL_TIME_ARRIVAL] INTEGER NOT NULL, '
                                                       + '[UTC_DIFF_DEPARTURE] INTEGER NOT NULL, '
                                                       + '[UTC_DIFF_ARRIVAL] INTEGER NOT NULL, '
                                                       + '[UTC_TIME_DEPARTURE] INTEGER NOT NULL, '
                                                       + '[UTC_TIME_ARRIVAL] INTEGER NOT NULL, '
                                                       + '[AIRCRAFT_TYPE] VARCHAR NOT NULL, '
                                                       + '[IS_DATED_FLIGHT] BOOL NOT NULL, '
                                                       + '[FLIGHT_DATE] INTEGER NOT NULL);';
    Quand je compile j'ai une erreur de type non conforme. Je connais mal PChar, est-ce que l'erreur vient de la??
    Je ne comprends pas non plus le ;var ztail:pchar) de la liste des arguments du prototype. Ça ne correspond pas aux arguments décrit.
    Merci de votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 604
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Je connais mal PChar, est-ce que l'erreur vient de la??
    certainement, cela va dépendre de la version de Delphi utilisée , Delphi 2009 et plus (passage à l'Unicode) les Pchar sont devenus ens fait des PWideChar
    pour avoir l'ancien Pchar il faut les déclarer PAnsiChar

    Ça ne correspond pas aux arguments décrit.
    en fait c'est parce que dans l'encapsulation ces arguments sont des "constantes"

    var ztail:pchar à la valeur IgnoreNextStmt

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    Je travaille avec Delphi 6, et juste plus haut il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sqlite3_open(PChar(sqlite_db_path),DB);  // Data base opening
    et le compilateur en a rien a faire

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Déclare IgnoreNextStmt : PChar; // suite des requêtes au lieu de IgnoreNextStmt : pointer; // SQL Query Handle !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    Merci pour les réponses, efficaces cela va sans dire.
    Juste à propos, j'ai essayé plusieurs solutions pour résoudre mon problème. Une de celle-ci
    provient d'un site de développeur, qui a écrit une SQLiteTable3:
    http://www.itwriting.com/blog/articl...r-for-sqlite-3
    Jusque ici cela marche bien et mon problème a été résolu comme en suivant:

    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
     
    procedure TSQLiteDatabase.ExecSQL(const SQL: Ansistring; const Bindings: array of const);
    var
      Stmt: TSQLiteStmt;
      NextSQLStatement: PAnsiChar;
      iStepResult: integer;
    begin
      try
        if Sqlite3_Prepare_v2(self.fDB, PAnsiChar(SQL), -1, Stmt, NextSQLStatement) <>
          SQLITE_OK then
          RaiseError('Error executing SQL', SQL);
        if (Stmt = nil) then
          RaiseError('Could not prepare SQL statement', SQL);
        DoQuery(SQL);
        SetParams(Stmt);
        BindData(Stmt, Bindings);
     
        iStepResult := Sqlite3_step(Stmt);
        if (iStepResult <> SQLITE_DONE) then
          begin
          SQLite3_reset(stmt);
          RaiseError('Error executing SQL statement', SQL);
          end;
      finally
        if Assigned(Stmt) then
          Sqlite3_Finalize(stmt);
      end;
    end;
    Ce qui est bien la solution proposée.

    Maintenant que je sais comment je ne sais pas pourquoi.
    C'est un peu bizarre pour un langage fortement typé de coller un pointeur à la place d'un tableau de char non?

    Si c'est possible j'aimerai bien en savoir un peu plus sur le sujet.

Discussions similaires

  1. Faut-il utiliser SQLite ?
    Par arnogb69 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/07/2008, 16h17
  2. Réponses: 3
    Dernier message: 11/04/2008, 09h48
  3. Utiliser SQLite en C# sous windows CE
    Par troubleshooting dans le forum C#
    Réponses: 3
    Dernier message: 26/03/2008, 09h42
  4. [SQLite] Utiliser SQLite avec PHP4
    Par fadeninev dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/10/2006, 16h10
  5. interface graphique utilisant sqlite
    Par isa21493 dans le forum SQLite
    Réponses: 3
    Dernier message: 17/07/2006, 15h28

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