DatabaseReadBind

Se déplace sur l'enregistrement suivant et écrit les données dans la structure passée.

bool  DatabaseReadBind(
   int    request,           // le handle d'une requête créée avec DatabasePrepare
   void&  struct_object      // référence sur une structure pour récupérer les données
   );

Paramètres

request

[in]  Le handle d'une requête créée avec DatabasePrepare().

struct_object

[out]  La référence sur une structure pour récupérer les données. La structure ne doit contenir que des types numériques et/ou chaînes de caractères (les tableaux ne sont pas autorisés) comme membres et ne peuvent pas être des descendants.

Valeur de Retour

Retourne true en cas de succès, sinon false. Pour obtenir le code d'erreur, utilisez GetLastError(), les réponses possibles sont :

  • ERR_INVALID_PARAMETER (4003)               —  aucun nom de table spécifié (chaîne vide ou NULL) ;
  • ERR_WRONG_STRING_PARAMETER (5040)  — erreur de conversion de la requête en UTF-8 ;
  • ERR_DATABASE_INTERNAL (5120)              — erreur interne de la base de données ;
  • ERR_DATABASE_INVALID_HANDLE (5121)   — handle invalide de la base de données ;
  • ERR_DATABASE_EXECUTE (5124)               — erreur d'exécution de la requête ;
  • ERR_DATABASE_NO_MORE_DATA (5126)    — aucune table n'existe (ceci n'est pas une erreur, mais une fin normale).

 

Note

Le nombre de colonnes dans la structure struct_object ne doit pas être supérieur à DatabaseColumnsCount(). Si le nombre de colonnes de la structure struct_object est inférieur au nombre de champs dans l'enregistrement, une lecture partielle est effectuée. Les données restantes peuvent être récupérées explicitement en utilisant les fonctions correspondantes DatabaseColumnText(), DatabaseColumnInteger() et autres.

Exemple:

struct Person
  {
   int               id;
   string            name;
   int               age;
   string            address;
   double            salary;
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int db;
   string filename="company.sqlite";
//--- open
   db=DatabaseOpen(filenameDATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE |DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
      Print("DB: "filename" open failed with code "GetLastError());
      return;
     }
//--- if the table COMPANY exists then drop the table
   if(DatabaseTableExists(db"COMPANY"))
     {
      //--- delete the table
      if(!DatabaseExecute(db"DROP TABLE COMPANY"))
        {
         Print("Failed to drop table COMPANY with code "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- create table
   if(!DatabaseExecute(db"CREATE TABLE COMPANY("
                       "ID INT PRIMARY KEY     NOT NULL,"
                       "NAME           TEXT    NOT NULL,"
                       "AGE            INT     NOT NULL,"
                       "ADDRESS        CHAR(50),"
                       "SALARY         REAL );"))
     {
      Print("DB: "filename" create table failed with code "GetLastError());
      DatabaseClose(db);
      return;
     }
 
//--- insert data
   if(!DatabaseExecute(db"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 25000.00 ); "
                       "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "
                       "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );"
                       "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"))
     {
      Print("DB: "filename" insert failed with code "GetLastError());
      DatabaseClose(db);
      return;
     }
 
//--- prepare the request
   int request=DatabasePrepare(db"SELECT * FROM COMPANY WHERE SALARY>15000");
   if(request==INVALID_HANDLE)
     {
      Print("DB: "filename" request failed with code "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- print records
   Person person;
   Print("Persons with salary > 15000:");
   for(int i=0DatabaseReadBind(requestperson); i++)
      Print(i":  "person.id" "person.name" "person.age" "person.address" "person.salary);
//--- delete request after use
   DatabaseFinalize(request);
 
   Print("Some statistics:");
//--- prepare new request about total salary
   request=DatabasePrepare(db"SELECT SUM(SALARY) FROM COMPANY");
   if(request==INVALID_HANDLE)
     {
      Print("DB: "filename" request failed with code "GetLastError());
      DatabaseClose(db);
      return;
     }
   while(DatabaseRead(request))
     {
      double total_salary;
      DatabaseColumnDouble(request0total_salary);
      Print("Total salary="total_salary);
     }
//--- delete request after use
   DatabaseFinalize(request);
 
//--- prepare new request about average salary
   request=DatabasePrepare(db"SELECT AVG(SALARY) FROM COMPANY");
   if(request==INVALID_HANDLE)
     {
      Print("DB: "filename" request failed with code "GetLastError());
      ResetLastError();
      DatabaseClose(db);
      return;
     }
   while(DatabaseRead(request))
     {
      double aver_salary;
      DatabaseColumnDouble(request0aver_salary);
      Print("Average salary="aver_salary);
     }
//--- delete request after use
   DatabaseFinalize(request);
 
//--- close database
   DatabaseClose(db);
  }
//+-------------------------------------------------------------------
/*
Output:
Persons with salary > 15000:
0:  1 Paul 32 California 25000.0
1:  3 Teddy 23 Norway 20000.0
2:  4 Mark 25 Rich-Mond  65000.0
Some statistics:
Total salary=125000.0
Average salary=31250.0
*/

Voir aussi

DatabasePrepare, DatabaseRead