DatabaseBind

Définit la valeur d'un paramètre dans une requête.

bool  DatabaseBind(
   int  request,      // le handle d'une requête créée avec DatabasePrepare
   int  index,        // l'indice du paramètre dans la requête
   T    value         // la valeur d'un paramètre de type simple
   );

Paramètres

request

[in]  Le handle d'une requête créée avec DatabasePrepare().

index

[in]  L'indice du paramètre dans la requête pour lequel la valeur doit être définie. La numérotation commence à zéro.

value

[in]  La valeur à définir. Types étendus : bool, char, uchar, short, ushart, int, uint, color, datetime, long, ulong, float, double, string.

Valeur de Retour

Retourne true en cas de succès, sinon - false. Pour obtenir le code de l'erreur, utilisez GetLastError(), les réponses possibles sont :

  • ERR_INVALID_PARAMETER (4003)             — type non supporté ;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - handle de base de données invalide ;
  • ERR_DATABASE_NOT_READY (5128)         - ne peut pas utiliser actuellement la fonction pour effectuer une requpete. La requête est en cours d'exécution ou déjà terminée. DatabaseReset() doit être appelé.

 

Note

La fonction est utilisée dans le cas où une requête SQL contient "?" ou "?N" valeurs paramétrables où N signifie l'indice du paramètre (à partir de un). Dans le même temps, l'indexation des paramètres dans DatabaseBind () commence à zéro.

Par exemple :

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

La fonction peut être appelée immédiatement après la création d'une demande paramétrée dans DatabasePrepare() ou après la réinitialisation de la demande à l'aide de DatabaseReset () .

Utilisez cette fonction avec DatabaseReset() pour exécuter la requête autant de fois que nécessaire avec différentes valeurs de paramètre.

La fonction est conçue pour fonctionner avec des paramètres de type simples. Si un paramètre doit être vérifié par rapport à un tableau, utilisez la fonction DatabaseBindArray().

Exemple :

//+------------------------------------------------------------------+
//| Fonction de démarrage du script                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlTick ticks[];
//--- mémorise l'heure de début avant de recevoir les ticks
   uint start=GetTickCount();
//--- demande l'historique des ticks par jour
   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) a échoué, erreur=%d",
                  _SymbolTimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)), _LastError);
      return;
     }
   else
     {
 //--- combien de ticks ont été reçus et combien de temps il a fallu pour les recevoir
 PrintFormat("%s : CopyTicksRange a reçu %d ticks en %d ms (de %s à %s)"
                  _SymbolArraySize(ticks), GetTickCount()-start,
                  TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)));
     }
 
//--- définit le nom du fichier pour stocker la base de données
   string filename=_Symbol+" "+TimeToString(datetime(from/1000))+" - "+TimeToString(datetime(to/1000))+".sqlite";
 StringReplace(nom de fichier, ": ""."); // le caractère ":" n'est pas autorisé dans les noms de fichier
//--- ouvre/crée la base de données dans le dossier commun du terminal
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
 Print("Base de données : échec de l'ouverture de ", filename, " avec le code "GetLastError());
      return;
     }
   else
 Print("Base de données :", filename, " ouvert avec succès");
 
//--- crée la table 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, "échec de 'create table TICKS' avec le code "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- affiche la liste de tous les champs de la table TICKS
   if(DatabasePrint(db, "PRAGMA TABLE_INFO(TICKS)", 0)<0)
     {
 PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(TICKS)\") a échoué, code d'erreur=%d à la ligne %d"GetLastError(), __LINE__);
      DatabaseClose(db);
      return;
     }
//--- crée une requête paramétrée pour ajouter des ticks à la table TICKS
   string sql="INSERT INTO TICKS (SYMBOL,TIME,BID,ASK,LAST,VOLUME,TIME_MSC,VOLUME_REAL)"
 " VALUES (?1,?2,?3,?4,?5,?6,?7,?8)"// paramètres de la requête
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
 PrintFormat("DatabasePrepare() a échoué avec le code=%d"GetLastError());
      Print("Requête SQL : ", sql);
      DatabaseClose(db);
      return;
     }
//--- définit la valeur du premier paramètre de la requête
   DatabaseBind(request, 0, _Symbol);
//--- mémorise l'heure de début avant d'ajouter des ticks à la table TICKS
   start=GetTickCount();
   DatabaseTransactionBegin(db);
   int total=ArraySize(ticks);
   bool request_error=false;
   for(int i=0; i<total; i++)
     {
 //--- définit les valeurs des paramètres restants avant d'ajouter l'entrée
      ResetLastError();
      if(!DatabaseBind(request, 1, ticks[i].time))
        {
 PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
 PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
 //--- si l'appel précédent à DatabaseBind() a réussi, définit le paramètre suivant 
      if(!request_error && !DatabaseBind(request, 2, ticks[i].bid))
        {
 PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
 PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 3, ticks[i].ask))
        {
 PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
 PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 4, ticks[i].last))
        {
 PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
 PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 5, ticks[i].volume))
        {
 PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
 PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 6, ticks[i].time_msc))
        {
 PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
 PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
      if(!request_error && !DatabaseBind(request, 7, ticks[i].volume_real))
        {
 PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
 PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
         request_error=true;
         break;
        }
 
 //--- exécute une requête d'insertion de l'entrée et recherche l'erreur
      if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
        {
 PrintFormat("DatabaseRead() a échoué avec le code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
 //--- réinitialise la requête avant la prochaine mise à jour des paramètres
      if(!request_error && !DatabaseReset(request))
        {
 PrintFormat("DatabaseReset() a échoué avec le code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
 } //--- tous les ticks ont été parcourus
 
//--- statuts des transactions
   if(request_error)
     {
 PrintFormat("Table TICKS : échec de l'ajout de %d ticks"ArraySize(ticks));
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
 PrintFormat("Table TICKS : ajout de %d ticks en %d ms"
                  ArraySize(ticks), GetTickCount()-start);
     }
 
//--- ferme le fichier de base de données et information
   DatabaseClose(db);
 PrintFormat("Base de données : %s créée et fermée", filename);
  }
/*
 Résultat :
 EURUSD : CopyTicksRange a reçu 268061 ticks en 47 ms (de 2020.03.18 12:40 à 2020.03.19 12:40)
 Base de données : EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite ouvert avec succès
  #| 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 : 268061 ticks ajoutés en 797 ms
 Base de données : EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite créée et fermée
  OnCalculateCorrelation=0.87 2020.03.19 13:00:  EURUSD vs GBPUSD  PERIOD_M30 
*/

Voir aussi

DatabasePrepare, DatabaseReset, DatabaseRead, DatabaseBindArray