DatabaseBindArray

Define a matriz como um valor de parâmetro.

bool  DatabaseBind(
   int  request,      // manipulador da consulta criada em DatabasePrepare
   int  index,        // índice do parâmetro na consulta
   T&   array[]       // valor de parâmetro como uma matriz
   );

Parâmetros

request

[in]  Identificador da consulta criada em DatabasePrepare().

index

[in]  Índice do parâmetro na consulta para o qual é necessário definir o valor. A numeração começa do zero.

array[]

[in]  Matriz que deve ser definida como valor do parâmetro da consulta.

Valor retornado

Retorna true em caso de sucesso, caso contrário, false. Para obter o código de erro, use GetLastError(), possíveis respostas:

  • ERR_INVALID_PARAMETER (4003)              — tipo não suportado;
  • ERR_ARRAY_BAD_SIZE (4011)                    - tamanho de matriz em bytes excede o valor INT_MAX;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - identificador de banco de dados inválido;
  • ERR_DATABASE_NOT_READY (5128)    - não se pode usar a função para consulta no momento (a consulta está sendo realizada ou já foi concluída, é necessário chamar DatabaseReset).

Observação

Esta função deve ser usada caso a consulta SQL contenha os valores parametrizáveis "?" ou"?N", onde N é o número do parâmetro (começando de um). Além disso, a indexação de parâmetros no DatabaseBindArray() começa do zero.

Por exemplo:

     INSERT INTO table VALUES (?,?,?)

Esta função pode ser chamada imediatamente quer após criada a consulta parametrizável em DatabasePrepare() quer após redefinir a consulta para o status inicial com a ajuda do DatabaseReset().

Use esta função juntamente com o DatabaseReset(), para executar a consulta quantas vezes forem necessárias com diferentes valores de parâmetros.

Exemplo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- abrimos a caixa de diálogo para selecionar arquivos com extensão DAT
   string selected_files[];
   if(!FileSelectDialog("Selecione arquivos para carregamento"NULL,
                       "Data files (*.dat)|*.dat|All files (*.*)|*.*",
                       FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
     {
      Print("Files not selected. Exit");
      return;
     }
//--- obtemos os parâmetros de arquivos
   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];
        }
     }
//--- verificamos o tamanho total do arquivo
   if(total_size==0)
     {
      PrintFormat("Total files size is 0. Exit");
      return;
     }
 
//--- criamos ou abrimos um banco de dados na pasta compartilhada do terminal
   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");
//--- se a tabela FILES existir, devemos exclui-la
   if(DatabaseTableExists(db, "FILES"))
     {
      //--- excluímos a tabela
      if(!DatabaseExecute(db, "DROP TABLE FILES"))
        {
         Print("Failed to drop table FILES with code "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- criamos a tabela 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;
     }
//--- exibimos uma lista contendo todos os campos na tabela 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;
     }
 
//--- criamos a consulta parametrizada para adicionar arquivos à tabela FILES
   string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
              " VALUES (?1,?2,?3,?4);"// parâmetros de consulta
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
      Print("SQL request: ", sql);
      DatabaseClose(db);
      return;
     }
 
//--- percorremos todos os arquivos e os adicionamos à tabela 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++;
         //--- definimos o valor dos parâmetros antes adicionar um arquivo à tabela
         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;
           }
         //--- executamos a consulta para inserir o registro e verificamos se há erros
         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);
         //--- redefinimos a consulta para seu status inicial antes da seguinte atualização de parâmetros
         if(!DatabaseReset(request))
           {
            PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
        }
     }
//--- resultado da transação
   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);
     }
 
//--- fechamos o arquivo contendo o banco de dados e relatamos isso
   DatabaseClose(db);
   PrintFormat("Database: %s created and closed", filename);
  }

Veja também

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBind