DatabaseReadBind

Выполняет переход к следующей записи и читает из неё данные в структуру.

bool  DatabaseReadBind(
   int    request,           // хендл запроса, созданного в DatabasePrepare
   void&  struct_object      // ссылка на структуру для чтения записи 
   );

Параметры

request

[in]  Хендл запроса, созданного в DatabasePrepare().

struct_object

[out]  Ссылка на структуру, в которую будут прочитаны данные из текущей записи. Структура должна иметь в качестве членов только числовые типы и/или строки (массивы не разрешены) и не может быть наследником.

Возвращаемое значение

Возвращает true в случае успеха или false, в случае ошибки. Для получения кода ошибки используйте GetLastError(), возможные ответы:

  • ERR_INVALID_PARAMETER (4003)               –  имя таблицы не задано (пустая строка или NULL);
  • ERR_WRONG_STRING_PARAMETER (5040)  – ошибка конвертации запроса в UTF-8 строку;
  • ERR_DATABASE_INTERNAL (5120)              – внутренняя ошибка базы данных;
  • ERR_DATABASE_INVALID_HANDLE (5121)    – невалидный хендл базы данных;
  • ERR_DATABASE_EXECUTE (5124)                –  ошибка выполнения запроса;
  • ERR_DATABASE_NO_MORE_DATA (5126)    – таблицы не существует (не является ошибкой, нормальное завершение).

 

Примечание

Количество полей в структуре struct_object не может превышать DatabaseColumnsCount(). Если количество полей в структуре struct_object меньше количества полей в записи, то будет произведено частичное чтение. Оставшиеся данные можно будет получить явным образом с помощью соответствующих функций DatabaseColumnText(), DatabaseColumnInteger() и так далее.

Пример:

struct Person
  {
   int               id;
   string            name;
   int               age;
   string            address;
   double            salary;
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string filename="company.sqlite";
//--- создадим или откроем базу данных в общей папке терминалов
   int db=DatabaseOpen(filenameDATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE |DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
      Print("DB: "filename" open failed with code "GetLastError());
      return;
     }
//--- если таблицыа COMPANY существует, то удалим её
   if(DatabaseTableExists(db"COMPANY"))
     {
      //--- удаляем таблицу
      if(!DatabaseExecute(db"DROP TABLE COMPANY"))
        {
         Print("Failed to drop table COMPANY with code "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- создаем таблицу
   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;
     }
 
//--- вставляем данные в таблицу 
   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;
     }
 
//--- создадим запрос и получим хендл на него
   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;
     }
//--- распечатаем все записи с зарплатой больше 15000
   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);
//--- удалим запрос после использования
   DatabaseFinalize(request);
 
   Print("Some statistics:");
//--- подготовим новый запрос о сумме зарплат
   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);
     }
//--- удалим запрос после использования
   DatabaseFinalize(request);
 
//--- подготовим новый запрос о средней зарплате
   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);
     }
//--- удалим запрос после использования
   DatabaseFinalize(request);
 
//--- закроем базу
   DatabaseClose(db);
  }
//+-------------------------------------------------------------------
/*
Результат выполнения:
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
*/

Смотри также

DatabasePrepare, DatabaseRead