DatabaseBindArray

Устанавливает массив в качестве значения параметра.

bool  DatabaseBind(
   int  request,      // хендл запроса, созданного в DatabasePrepare
   int  index,        // индекс параметра в запросе
   T&   array[]       // значение параметра в виде массива
   );

Параметры

request

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

index

[in]  Индекс параметра в запросе, для которого нужно установить значение. Нумерация начинается с нуля.

array[]

[in]  Массив, который необходимо установить в качестве значения параметра запроса.

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

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

  • ERR_INVALID_PARAMETER (4003)              – неподдерживаемый тип;
  • ERR_ARRAY_BAD_SIZE (4011)                    - размер массива в байтах превышает  значение INT_MAX;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - невалидный хендл базы данных;
  • ERR_DATABASE_NOT_READY (5128)    - нельзя использовать функцию для запроса в данный момент (Запрос уже выполняется или  завершён, требуется вызвать DatabaseReset).

Примечание

Функцию следует использовать в случае, когда SQL запрос содержит параметризируемые значения "?" или "?N", где N означает номер параметра (начиная с единицы). При этом индексация параметров в DatabaseBindArray() начинается с нуля.

Например:

     INSERT INTO table VALUES (?,?,?)

Функцию можно вызывать сразу после того, как параметризованный запрос был создан в DatabasePrepare(), либо после сброса запроса в начальное состояние с помощью DatabaseReset().

Используйте эту функцию совместно с DatabaseReset(), чтобы выполнить запрос нужное количество раз с разными значениями параметров.

Пример:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- откроем диалог для выбора файлов c расширением DAT
   string selected_files[];
   if(!FileSelectDialog("Выберите файлы для загрузки"NULL,
                       "Data files (*.dat)|*.dat|All files (*.*)|*.*",
                       FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
     {
      Print("Files not selected. Exit");
      return;
     }
//--- получим размеры файлов
   ulong filesize[];
   int filehandle[];
   int files=ArraySize(selected_files);
   ArrayResize(filesize, files);
   ZeroMemory(filesize);
   ArrayResize(filehandle, files);
   double total_size=0;
   for(int i=0; i<files; i++)
     {
      filehandle[i]=FileOpen(selected_files[i], FILE_READ|FILE_BIN);
      if(filehandle[i]!=INVALID_HANDLE)
        {
         filesize[i]=FileSize(filehandle[i]);
         //PrintFormat("%d, %s handle=%d %d bytes", i, selected_files[i], filehandle[i], filesize[i]);
         total_size+=(double)filesize[i];
        }
     }
//--- проверим общий размер файлов
   if(total_size==0)
     {
      PrintFormat("Total files size is 0. Exit");
      return;
     }
 
//--- создадим или откроем базу данных в общей папке терминалов
   string filename="dat_files.sqlite";
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
   if(db==INVALID_HANDLE)
     {
      Print("DB: ", filename, " open failed with code "GetLastError());
      return;
     }
   else
      Print("Database: ", filename, " opened successfully");
//--- если таблица FILES существует, то удалим её
   if(DatabaseTableExists(db, "FILES"))
     {
      //--- удаляем таблицу
      if(!DatabaseExecute(db, "DROP TABLE FILES"))
        {
         Print("Failed to drop table FILES with code "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- создадим таблицу FILES
   if(!DatabaseExecute(db, "CREATE TABLE FILES("
                       "NAME           TEXT NOT NULL,"
                       "SIZE           INT  NOT NULL,"
                       "PERCENT_SIZE   REAL NOT NULL,"
                       "DATA           BLOB NOT NULL);"))
     {
      Print("DB: failed to create table FILES with code "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- покажем список всех полей в таблице FILES
   if(DatabasePrint(db, "PRAGMA TABLE_INFO(FILES)", 0)<0)
     {
      PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(FILES)\") failed, error code=%d at line %d"GetLastError(), __LINE__);
      DatabaseClose(db);
      return;
     }
 
//--- создадим параметризованный запрос добавления файлов в таблицу FILES
   string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
              " VALUES (?1,?2,?3,?4);"// параметры запроса
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
      Print("SQL request: ", sql);
      DatabaseClose(db);
      return;
     }
 
//--- пройдем по всем файлам и добавим их в таблицу FILES
   bool request_error=false;
   DatabaseTransactionBegin(db);
   int count=0;
   uint size;
   for(int i=0; i<files; i++)
     {
      if(filehandle[i]!=INVALID_HANDLE)
        {
         char data[];
         size=FileReadArray(filehandle[i], data);
         if(size==0)
           {
            PrintFormat("FileReadArray(%s) failed with code %d", selected_files[i], GetLastError());
            continue;
           }
 
         count++;
         //--- устанавливаем значения параметров перед добавлением файла в таблицу
         if(!DatabaseBind(request, 0, selected_files[i]))
           {
            PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBind(request, 1, size))
           {
            PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBind(request, 2, double(size)*100./total_size))
           {
            PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBindArray(request, 3, data))
           {
            PrintFormat("DatabaseBind() failed at line %d with code=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         //--- выполним запрос на вставку записи и проверим на ошибку
         if(!DatabaseRead(request)&&(GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
           {
            PrintFormat("DatabaseRead() failed with code=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
         else
            PrintFormat("%d. %s: %d bytes", count, selected_files[i],size);
         //--- сбросим запрос в начальное состояние перед следующим обновлением параметров
         if(!DatabaseReset(request))
           {
            PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
        }
     }
//--- как прошли транзакции?
   if(request_error)
     {
      PrintFormat("Table FILES: failed to add %d files", count);
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
      PrintFormat("Table FILES: added %d files", count);
     }
 
//--- закроем файл с базой данных и сообщим об этом
   DatabaseClose(db);
   PrintFormat("Database: %s created and closed", filename);
  }

Смотри также

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBind