DatabaseBindArray

Imposta un array come valore di parametro.

bool  DatabaseBind(
   int  request,      // l'handle di una richiesta creata in DatabasePrepare
   int  index,        // l'indice dei parametri nella richiesta
   T&   array[]       // valore del parametro come array
   );

Parametri

request

[in] L'handle di una richiesta creata in DatabasePrepare().

index

[in] L'indice dei parametri nella richiesta per cui deve essere impostato un valore. La numerazione inizia con zero.

array[]

[in] L'array da impostare come valore del parametro di richiesta.

Valore di Ritorno

Restituisce true se ha esito positivo, altrimenti - false. Per ottenere il codice di errore, utilizzare GetLastError(), le possibili risposte sono:

  • ERR_INVALID_PARAMETER (4003)              – tipo non supportato;
  • ERR_ARRAY_BAD_SIZE (4011)                    - la grandezza dell'array in byte supera INT_MAX;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - handle database non valido;
  • ERR_DATABASE_NOT_READY (5128)         - al momento non è possibile utilizzare la funzione per effettuare una richiesta (la richiesta è in esecuzione o già completa, è necessario chiamare DatabaseReset).

Nota

La funzione viene utilizzata nel caso in cui una richiesta SQL contenga i valori parametrizzabili "?" o "?N" dove N indica l'indice dei parametri (a partire da uno). Allo stesso tempo, l'indicizzazione dei parametri in DatabaseBindArray() inizia da zero.

Per esempio:

     INSERT INTO table VALUES (?,?,?)

La funzione può essere chiamata immediatamente dopo la creazione di una richiesta parametrizzata DatabasePrepare() o dopo che la richiesta è stata ripristinata utilizzando DatabaseReset().

Utilizzare questa funzione insieme a DatabaseReset() per eseguire la richiesta tutte le volte necessarie con valori di parametro diversi.

Esempio:

//+------------------------------------------------------------------+
// | Funzione di avvio del programma Script                          |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- apre la finestra di dialogo per selezionare i file con l'estensione DAT
   string selected_files[];
   if(!FileSelectDialog("Seleziona i file da scaricare"NULL,
                       "Data files (*.dat)|*.dat|All files (*.*)|*.*",
                       FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
     {
      Print("File non selezionati. Exit");
      return;
     }
//--- ottiene la dimensione dei file
   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];
        }
     }
//--- controlla la grandezza comune dei file
   if(total_size==0)
     {
      PrintFormat("La grandezza totale dei file è 0. Exit");
      return;
     }
 
//--- crea o apre il database nella cartella comune del terminale
   string filename="dat_files.sqlite";
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
   if(db==INVALID_HANDLE)
     {
      Print("DB: ", filename, " apertura fallita con codice "GetLastError());
      return;
     }
   else
      Print("Database: ", filename, " aperto con successo");
//--- se esiste la tabella FILES, eliminala
   if(DatabaseTableExists(db, "FILES"))
     {
      //--- elimina la tabella
      if(!DatabaseExecute(db, "DROP TABLE FILES"))
        {
         Print("Fallimento nell'eliminare la tabella FILES con codice "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- crea la tabella 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: fallimento nel creare la tabella FILES con codice "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- visualizza l'elenco di tutti i campi nella tabella FILES
   if(DatabasePrint(db, "PRAGMA TABLE_INFO(FILES)", 0)<0)
     {
      PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(FILES)\") fallito, codice errore=%d alla riga %d"GetLastError(), __LINE__);
      DatabaseClose(db);
      return;
     }
 
//--- crea una richiesta parametrizzata per aggiungere file alla tabella FILES
   string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
              " VALUES (?1,?2,?3,?4);"// richieste parametri
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() fallito con codice=%d"GetLastError());
      Print("SQL request: ", sql);
      DatabaseClose(db);
      return;
     }
 
//--- passa attraverso tutti i file e li aggiunge alla tabella 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) fallita con codice %d", selected_files[i], GetLastError());
            continue;
           }
 
         count++;
         //--- imposta i valori dei parametri prima di aggiungere il file alla tabella
         if(!DatabaseBind(request, 0, selected_files[i]))
           {
            PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBind(request, 1, size))
           {
            PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBind(request, 2, double(size)*100./total_size))
           {
            PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         if(!DatabaseBindArray(request, 3, data))
           {
            PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
            request_error=true;
            break;
           }
         //--- esegue una richiesta di inserimento della voce e verifica la presenza di un errore
         if(!DatabaseRead(request)&&(GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
           {
            PrintFormat("DatabaseRead() fallito con codice=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
         else
            PrintFormat("%d. %s: %d byte", count, selected_files[i],size);
         //--- resetta la richiesta prima del prossimo aggiornamento dei parametri
         if(!DatabaseReset(request))
           {
            PrintFormat("DatabaseReset() fallito con codice=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
        }
     }
//--- stato delle transazioni
   if(request_error)
     {
      PrintFormat("Tabella FILES: fallita per aggiungere %d files", count);
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
      PrintFormat("Tabella FILES: aggiunti %d file", count);
     }
 
//--- chiude il file del database e informa di ciò
   DatabaseClose(db);
   PrintFormat("Database: %s creato e chiuso", filename);
  }

Vedi anche

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBind