DatabaseBindArray

Establece una matriz como valor del parámetro.

bool  DatabaseBind(
   int  request,      // manejador de la solicitud creada en DatabasePrepare
   int  index,        // índice del parámetro en la solicitud
   T&   array[]       // valor del parámetro en forma de matriz
   );

Parámetros

request

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

index

[in]  Índice del parámetro en la solicitud para la que se debe establecer el valor. La numeración parte desde el cero.

array[]

[in]  Matriz que se debe establecer como valor del parámetro de la solicitud.

Valor retornado

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

  • ERR_INVALID_PARAMETER (4003)              — tipo no soportado;
  • ERR_ARRAY_BAD_SIZE (4011)                    - el tamaño de la matriz en bytes supera el valor INT_MAX;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - manejador no válido de la base de datos;
  • ERR_DATABASE_NOT_READY (5128)    - no es posible usar la función para la solicitud en estos momentos (La solicitud ya se está ejecutando o ha sido finalizada, es necesario llamar a DatabaseReset).

Observación

La función se debe usar solo cuando una solicitud SQL contiene los valores parametrizables "?" o "?N", donde N indica el número del parámetro (comenzando por la unidad). En este caso, además, la indexación de los parámetros en DatabaseBindArray() comienza a partir de cero.

Por ejmplo:

     INSERT INTO table VALUES (?,?,?)

La función se puede llamar justo después de que la solicitud parametrizada haya sido creada en DatabasePrepare(), o bien tras resetear la solicitud a su estado inicial con la ayuda de DatabaseReset().

Use esta función junto con DatabaseReset() para ejecutar la solicitud el número necesario de veces con diferentes valores de parámetros.

Ejemplo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- abriendo ventana de diálogo para seleccionar los archivos con la extensión DAT
   string selected_files[];
   if(!FileSelectDialog("Seleccione los archivos para la carga"NULL,
                       "Data files (*.dat)|*.dat|All files (*.*)|*.*",
                       FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
     {
      Print("Files not selected. Exit");
      return;
     }
//--- obteniendo el tamaño de los archivos
   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];
        }
     }
//--- comprobando el tamaño total de los archivos
   if(total_size==0)
     {
      PrintFormat("Total files size is 0. Exit");
      return;
     }
 
//--- Creamos o abrimos la base de datos en la carpeta general del 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");
//--- si el recuadro FILES existe, lo eliminamos
   if(DatabaseTableExists(db, "FILES"))
     {
      //--- eliminamos el recuadro
      if(!DatabaseExecute(db, "DROP TABLE FILES"))
        {
         Print("Failed to drop table FILES with code "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- creamos el recuadro 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;
     }
//--- mostrando la lista de todos los campos en el recuadro 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;
     }
 
//--- creando una solicitud parametrizada de adición de archivos al recuadro FILES
   string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
              " VALUES (?1,?2,?3,?4);"// parámetros de la solicitud
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
      Print("SQL request: ", sql);
      DatabaseClose(db);
      return;
     }
 
//--- iteramos por todos los archivos y los añadimos al recuadro 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++;
         //--- estableciendo los valores de los parámetros antes de añadir un archivo al recuadro
         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;
           }
         //--- ejecutando la solicitud de inserción de una entrada y comprobando si es errónea
         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);
         //--- reseteando la solicitud a su estado inicial antes de la siguiente actualización de parámetros
         if(!DatabaseReset(request))
           {
            PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
        }
     }
//--- ¿cómo han salido las transacciones?
   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);
     }
 
//--- cerramos el archivo con la base de datos y comunicamos este hecho
   DatabaseClose(db);
   PrintFormat("Database: %s created and closed", filename);
  }

Ver también

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBind