DatabaseReadBind

Pasa a la siguiente entrada y lee los datos en la estructura de esta.

bool  DatabaseReadBind(
   int    request,           // manejador de la solicitud creada en DatabasePrepare
   void&  struct_object      // enlace a la estructura para leer la entrada 
   );

Parámetros

request

[in]  Manejador de la solicitud creada en DatabasePrepare().

struct_object

[out]  Enlace a la estructura en la que se leerán los datos de la entrada actual. La estructura deberá tener como miembros solo tipos numéricos y/o string (las matrices no están permitidas), y no puede ser heredera.

Valor retornado

Retorna true en caso de éxito, o false en caso de error. Para obtener el código del error, use GetLastError(), posibles respuestas:

  • ERR_INVALID_PARAMETER (4003)               —  el nombre del recuadro no ha sido establecido (línea vacía o NULL);
  • ERR_WRONG_STRING_PARAMETER (5040)  — error de conversión de la solicitud en una línea UTF-8;
  • ERR_DATABASE_INTERNAL (5120)              — error interno en la base de datos;
  • ERR_DATABASE_INVALID_HANDLE (5121)    — manejador no válido de la base de datos;
  • ERR_DATABASE_EXECUTE (5124)                —  error de ejecución de la solicitud;
  • ERR_DATABASE_NO_MORE_DATA (5126)    — el recuadro no existe (no es un error, finalización normal).

 

Observación

El número de campos en la estructura struct_object no puede superar DatabaseColumnsCount(). Si el número de campos en la estructura struct_object es inferior al número de campos en la entrada, se realizará solo la lectura parcial. El resto de datos se podrá obtener explícitamente con la ayuda de las funciones correspondientes DatabaseColumnText(), DatabaseColumnInteger(), etcétera.

Ejemplo:

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
*/

Ver también

DatabasePrepare, DatabaseRead