DatabaseBind

Setzt einen Parameterwert in einer Anfrage.

bool  DatabaseBind(
   int  request,      // Handle der Anfrage, das durch DatabasePrepare erhalten wurde
   int  index,        // der Parameterindex in der Anfrage
   T    value         // der Wert eines Parameters eines einfachen Typs
   );

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.

value

[in]  Der Wert, der zu setzen ist. Mögliche Typen: bool, char, uchar, short, ushart, int, uint, color, datetime, long, ulong, float, double, string.

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_DATABASE_INVALID_HANDLE (5121)  - ungültiges Handle der Datenbank;
  • ERR_DATABASE_NOT_READY (5128)         - Funktion kann zur Zeit nicht für eine Anfrage verwendet werden. Die Anfrage wird 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 DatabaseBind() bei Null.

Zum Beispiel:

     INSERT INTO table VALUES (?,?,?)
     SELECT * FROM table WHERE id=?

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.

Die Funktion ist so konzipiert, dass sie mit den einfachen Typen der Parameter arbeitet. Wenn ein Parameter gegen ein Array geprüft werden soll, verwenden Sie die Funktion DatabaseBindArray().

Beispiel:

//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlTick ticks[];
//--- sichern der Startzeit vor dem Erhalt der Ticks
   uint start=GetTickCount();
//--- Anfordern der Tick-Historie pro Tag
   ulong to=TimeCurrent()*1000;
   ulong from=to-PeriodSeconds(PERIOD_D1)*1000;
   if(CopyTicksRange(_Symbol, ticks, COPY_TICKS_ALL, from, to)==-1)
     {
      PrintFormat("%s: CopyTicksRange(%s - %s) failed, error=%d",
                  _SymbolTimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)), _LastError);
      return;
     }
   else
     {
      //--- wie viele Ticks wurden erhalten und wie lange dauerte es, sie zu bekommen
      PrintFormat("%s: CopyTicksRange received %d ticks in %d ms (from %s to %s)",
                  _SymbolArraySize(ticks), GetTickCount()-start,
                  TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)));
     }
 
//--- Setzen des Dateinamen zum Speichern der Datenbank
   string filename=_Symbol+" "+TimeToString(datetime(from/1000))+" - "+TimeToString(datetime(to/1000))+".sqlite";
   StringReplace(filename, ":""."); // ":" character is not allowed in file names
//--- Erstellen/Öffnen einer Datenbank im Verzeichnis Common des Terminals
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
      Print("Database: ", filename, " open failed with code "GetLastError());
      return;
     }
   else
      Print("Database: ", filename, " opened successfully");
 
//--- Erstellen der Tabelle der Ticks
   if(!DatabaseExecute(db, "CREATE TABLE TICKS("
                       "SYMBOL             CHAR(10),"
                       "TIME               INT NOT NULL,"
                       "BID                REAL,"
                       "ASK                REAL,"
                       "LAST               REAL,"
                       "VOLUME             INT,"
                       "TIME_MSC           INT,"
                       "VOLUME_REAL        REAL);"))
     {
      Print("DB: ", filename, " create table TICKS failed with code "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- Darstellung der Liste aller Felder der Tabellen der Ticks
   if(DatabasePrint(db, "PRAGMA TABLE_INFO(TICKS)", 0)<0)
     {
      PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(TICKS)\") failed, error code=%d at line %d"GetLastError(), __LINE__);
      DatabaseClose(db);
      return;
     }
//--- Erstellen einer parametrisierten Anfrage, um Ticks der Tabelle der Ticks hinzuzufügen
   string sql="INSERT INTO TICKS (SYMBOL,TIME,BID,ASK,LAST,VOLUME,TIME_MSC,VOLUME_REAL)"
              " VALUES (?1,?2,?3,?4,?5,?6,?7,?8)"// 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;
     }
//--- Setzen des Wertes des ersten Parameters der Anfrage
   DatabaseBind(request, 0, _Symbol);
//--- sichern der Startzeit vor dem Hinzufügen der Ticks zu Tabelle der Ticks
   start=GetTickCount();
   DatabaseTransactionBegin(db);
   int total=ArraySize(ticks);
   bool request_error=false;
   for(int i=0; i<total; i++)
     {
      //--- Setzen der Werte der verbliebenen Parameter vor dem Hinzufügen der Eingabe
      ResetLastError();
      if(!DatabaseBind(request, 1, ticks[i].time))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      //--- Falls der vorherige Aufruf von DatabaseBind() erfolgreich war, wird der nächste Parameter gesetzt       
      if(!request_error && !DatabaseBind(request, 2, ticks[i].bid))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 3, ticks[i].ask))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 4, ticks[i].last))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 5, ticks[i].volume))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 6, ticks[i].time_msc))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 7, ticks[i].volume_real))
        {
         PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
         PrintFormat("Tick #%d line=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
 
      //--- Ausführen der Anfrage, um die Eingabe einzutragen, einschließlich einer Fehlerprüfung
      if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
        {
         PrintFormat("DatabaseRead() failed with code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
      //--- Rücksetzen der Anfrage vor der nächsten Parameteraktualisierung
      if(!request_error && !DatabaseReset(request))
        {
         PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
     } //--- Fertig, alle Ticks wurden verarbeitet
 
//--- Transaktionsstatus
   if(request_error)
     {
      PrintFormat("Table TICKS: failed to add %d ticks "ArraySize(ticks));
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
      PrintFormat("Table TICKS: added %d ticks in %d ms",
                  ArraySize(ticks), GetTickCount()-start);
     }
 
//--- Schließen der Datenbankdatei und Informieren darüber
   DatabaseClose(db);
   PrintFormat("Database: %s created and closed", filename);
  }
/*
 Ergebnis:
  EURUSD: CopyTicksRange received 268061 ticks in 47 ms (from 2020.03.18 12:40 to 2020.03.19 12:40)
  Database: EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite opened successfully
  #| cid name        type     notnull dflt_value pk
  -+-----------------------------------------------
  1|   0 SYMBOL      CHAR(10)       0             0 
  2|   1 TIME        INT            1             0 
  3|   2 BID         REAL           0             0 
  4|   3 ASK         REAL           0             0 
  5|   4 LAST        REAL           0             0 
  6|   5 VOLUME      INT            0             0 
  7|   6 TIME_MSC    INT            0             0 
  8|   7 VOLUME_REAL REAL           0             0 
  Table TICKS: added 268061 ticks in 797 ms
  Database: EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite created and closed
  OnCalculateCorrelation=0.87 2020.03.19 13:00:  EURUSD vs GBPUSD  PERIOD_M30 
*/

Siehe auch

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBindArray