DatabaseBindArray

Setzt einen Parameterarray als Parameterwert.

bool  DatabaseBind(
   int  request,      // Handle der Anfrage, das durch DatabasePrepare erhalten wurde
   int  index,        // der Parameterindex in der Anfrage
   T&   array[]       // Array mit den Parameterwerten
   );

Parameter

request

[in]  Das Handle einer Anfrage, das in DatabasePrepare() erstellt wurde.

index

[in]  Der Parameterindex der Anfrage, dessen Werte gesetzt werden soll. Die Nummerierung beginnt mit Null.

array[]

[in]  Der Array als Parameter der Anfrage.

Rückgabewert

Liefert bei Erfolg true, ansonsten false. Um die Fehlernummer zu erhalten, verwenden Sie GetLastError(), die möglichen Antworten sind:

  • ERR_INVALID_PARAMETER (4003)              – Typ wird nicht unterstützt;
  • ERR_ARRAY_BAD_SIZE (4011)                    - die Arraygröße in Bytes überschreitet INT_MAX;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - ungültiges Handle der Datenbank;
  • ERR_DATABASE_NOT_READY (5128)    - die Funktion kann im Moment nicht für eine Anfrage verwenden (die Anfrage wird gerade ausgeführt oder ist bereits beendet, DatabaseReset sollte aufgerufen werden).

Hinweis

Die Funktion wird verwendet, wenn eine SQL-Anfrage parametrisierbare Werte der Form "?" oder "?N" enthält, wobei N den Parameterindex (beginnend mit Eins) bedeutet. Gleichzeitig beginnt die Indizierung der Parameter in DatabaseBindArray() bei Null.

Zum Beispiel:

     INSERT INTO table VALUES (?,?,?)

Die Funktion kann unmittelbar nach der Erzeugung einer parametrisierten Anfrage in DatabasePrepare() oder nach dem Zurücksetzen der Anforderung mit DatabaseReset() aufgerufen werden.

Verwenden Sie diese Funktion zusammen mit DatabaseReset(), um die Anfrage so oft wie nötig mit verschiedenen Parameterwerten auszuführen.

Beispiel:

//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Öffnen des Dialogs zur Dateiauswahl mit der Erweiterung DAT
   string selected_files[];
   if(!FileSelectDialog("Select files to download"NULL,
                       "Data files (*.dat)|*.dat|All files (*.*)|*.*",
                       FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
     {
      Print("Files not selected. Exit");
      return;
     }
//--- Abrufen der Dateigröße
   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];
        }
     }
//--- Prüfen der Gesamtgröße aller Dateien
   if(total_size==0)
     {
      PrintFormat("Total files size is 0. Exit");
      return;
     }
 
//--- Erstellen oder Öffnen einer Datenbank im Verzeichnis Common des Terminals
   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");
//--- Falls die Tabelle FILES existiert, wird sie gelöscht
   if(DatabaseTableExists(db, "FILES"))
     {
      //--- löschen der Tabelle
      if(!DatabaseExecute(db, "DROP TABLE FILES"))
        {
         Print("Failed to drop table FILES with code "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- Erstellen der Tabelle 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;
     }
//--- Anzeige der Liste aller Felder der Tabelle 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;
     }
 
//--- Erstellen einer parametrisierten Anfrage, um Dateien der Tabelle FILES hinzuzufügen
   string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
              " VALUES (?1,?2,?3,?4);"// Parameter der Anfrage
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
      Print("SQL request: ", sql);
      DatabaseClose(db);
      return;
     }
 
//--- Schleife über alle Dateien, um sie der Tabelle FILES hinzuzufügen
   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++;
         //--- Setzen der Parameterwerte vor dem Hinzufügen der Datei zur Tabelle
         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;
           }
         //--- Ausführen der Anfrage, um die Eingabe einzutragen, einschließlich einer Fehlerprüfung
         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);
         //--- Rücksetzen der Anfrage vor der nächsten Parameteraktualisierung
         if(!DatabaseReset(request))
           {
            PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
            DatabaseFinalize(request);
            request_error=true;
            break;
           }
        }
     }
//--- Transaktionsstatus
   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);
     }
 
//--- Schließen der Datenbankdatei und Informieren darüber
   DatabaseClose(db);
   PrintFormat("Database: %s created and closed", filename);
  }

Siehe auch

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBind