DatabaseReset

Réinitialise une requête, comme après avoir appelé DatabasePrepare().

int  DatabaseReset(
   int  request      // handle de requête récupéré de DatabasePrepare
   );

Paramètres

request

[in]  Le handle de la requête obtenu avec DatabasePrepare().

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_DATABASE_INVALID_HANDLE (5121) - handle de base de données invalide ;
  • Des codes d'erreur SQLite commençant avec ERR_DATABASE_ERROR(5601).

Note

La fonction DatabaseReset() est destinée à l'exécution multiple d'une requête avec différentes valeurs de paramètres. Par exemple, lors de l'ajout de données à la table en bloc à l'aide de la commande INSERT, un ensemble personnalisé de valeurs de champ doit être formé pour chaque entrée.

Contrairement à DatabasePrepare(), l'appel DatabaseReset() ne compile pas la chaîne avec les commandes SQL dans une nouvelle requête, donc DatabaseReset() est exécuté beaucoup plus rapidement que DatabasePrepare().

DatabaseReset() est utilisé avec les fonctions DatabaseBind() et/ou DatabaseBindArray() si les valeurs des paramètres de la requête doivent être modifiées après l'exécution de DatabaseRead(). Cela signifie qu'avant de définir de nouvelles valeurs des paramètres de requête (avant le bloc d'appels DatabaseBind/DatabaseBindArray), DatabaseReset() doit être appelé pour le réinitialiser. La requête paramétrée elle-même doit être créée à l'aide de DatabasePrepare().

Tout comme DatabasePrepare(), DatabaseReset() ne fait pas de requête en base de données. Une exécution directe de la requête est effectuée lors de l'appel de DatabaseRead() ou DatabaseReadBind().

L'appel DatabaseReset() ne conduit pas à réinitialiser les valeurs des paramètres dans la requête si elles ont été définies en appelant DatabaseBind()/DatabaseBindArray(), c'est-à-dire que les paramètres conservent leurs valeurs. Ainsi, la valeur d'un seul paramètre peut être modifiée. Il n'est pas nécessaire de définir à nouveau tous les paramètres de demande après avoir appelé DatabaseReset().

Le handle d'une requête supprimée à l'aide de DatabaseFinalize() ne peut pas être transmis à DatabaseReset(). Cela entraînera une erreur.

Exemple :

//+------------------------------------------------------------------+
//| Fonction de démarrage du script                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- crée ou ouvre une base de données
   string filename="symbols.sqlite";
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
   if(db==INVALID_HANDLE)
     {
 Print("DB: échec de l'ouverture de ", filename,  avec le code "GetLastError());
      return;
     }
   else
 Print("Base de données :", filename, " ouvert avec succès");
//--- supprime la table SYMBOLS si elle existe
   if(DatabaseTableExists(db, "SYMBOLS"))
     {
      //--- supprime la table
      if(!DatabaseExecute(db, "DROP TABLE SYMBOLS"))
        {
         Print("Impossible de supprimer la table SYMBOLS avec le code "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- crée la table SYMBOLS
   if(!DatabaseExecute(db, "CREATE TABLE SYMBOLS("
                       "NAME           TEXT    NOT NULL,"
                       "DESCRIPTION    TEXT            ,"
                       "PATH           TEXT            ,"
                       "SPREAD         INT             ,"
                       "POINT          REAL    NOT NULL,"
                       "DIGITS         INT     NOT NULL,"
                       "JSON           BLOB );"))
     {
      Print("DB : ", filename, " échec de 'create table' avec le code "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- affiche la liste de tous les champs de la table TICKS
   if(DatabasePrint(db, "PRAGMA TABLE_INFO(SYMBOLS)", 0)<0)
     {
      PrintFormat("Echec de DatabasePrint(\"PRAGMA TABLE_INFO(SYMBOLS)\"), code d'erreur=%d à la ligne %d"GetLastError(), __LINE__);
      DatabaseClose(db);
      return;
     }
 
//--- crée une requête paramétrée pour ajouter des symboles à la table SYMBOLS
   string sql="INSERT INTO SYMBOLS (NAME,DESCRIPTION,PATH,SPREAD,POINT,DIGITS,JSON)"
              " VALUES (?1,?2,?3,?4,?5,?6,?7);"// 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;
     }
 
//--- parcours tous les symboles et les ajoute à la table SYMBOLS
   int symbols=SymbolsTotal(false);
   bool request_error=false;
   DatabaseTransactionBegin(db);   
   for(int i=0; i<symbols; i++)
     {
      //--- définit les valeurs des paramètres avant d'ajouter un symbole
      ResetLastError();
      string symbol=SymbolName(i, false);
      if(!DatabaseBind(request, 0, symbol))
        {
         PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      //--- si l'appel précédent DatabaseBind () a réussi, définit le paramètre suivant
      if(!DatabaseBind(request, 1, SymbolInfoString(symbolSYMBOL_DESCRIPTION)))
        {
         PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 2, SymbolInfoString(symbolSYMBOL_PATH)))
        {
         PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 3, SymbolInfoInteger(symbolSYMBOL_SPREAD)))
        {
         PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 4, SymbolInfoDouble(symbolSYMBOL_POINT)))
        {
         PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 5, SymbolInfoInteger(symbolSYMBOL_DIGITS)))
        {
         PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 6, GetSymBolAsJson(symbol)))
        {
         PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
 
 //--- exécute une requête d'insertion de l'entrée et recherche l'erreur
      if(!DatabaseRead(request)&&(GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
        {
 PrintFormat("DatabaseRead() a échoué avec le code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
      else
         PrintFormat("%d: %s ajouté", i+1, symbol);
 //--- réinitialise la requête avant la prochaine mise à jour des paramètres
      if(!DatabaseReset(request))
        {
 PrintFormat("DatabaseReset() a échoué avec le code=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
     } //--- tous les symboles ont été parcourus
 
//--- statuts des transactions
   if(request_error)
     {
      PrintFormat("Table SYMBOLS : échec de l'ajout de %d symboles", symbols);
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
      PrintFormat("Table SYMBOLS : %d symboles ajoutés",symbols);
     }
 
//--- sauvegarde la table SYMBOLS dans un fichier CSV
   string csv_filename="symbols.csv";
   if(DatabaseExport(db, "SELECT * FROM SYMBOLS", csv_filename,
                     DATABASE_EXPORT_HEADER|DATABASE_EXPORT_INDEX|DATABASE_EXPORT_QUOTED_STRINGS";"))
      Print("Base de données : la table SYMBOLS a été sauvée dans ", csv_filename);
   else
      Print("Base de données : DatabaseExport(\"SELECT * FROM SYMBOLS\") a échoué avec le code "GetLastError());
 
//--- ferme le fichier de base de données et information
   DatabaseClose(db);
 PrintFormat("Base de données : %s créée et fermée", filename);
  }
//+------------------------------------------------------------------+
//| Retourne la spécification d'un symbole au format JSON            |
//+------------------------------------------------------------------+
string GetSymBolAsJson(string symbol)
  {
//--- indents
   string indent1=Indent(1);
   string indent2=Indent(2);
   string indent3=Indent(3);
//---
   int digits=(int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   string json="{"+
               "\n"+indent1+"\"ConfigSymbols\":["+
               "\n"+indent2+"{"+
               "\n"+indent3+"\"Symbol\":\""+symbol+"\","+
               "\n"+indent3+"\"Path\":\""+SymbolInfoString(symbolSYMBOL_PATH)+"\","+
               "\n"+indent3+"\"CurrencyBase\":\""+SymbolInfoString(symbolSYMBOL_CURRENCY_BASE)+"\","+
               "\n"+indent3+"\"CurrencyProfit\":\""+SymbolInfoString(symbolSYMBOL_CURRENCY_PROFIT)+"\","+
               "\n"+indent3+"\"CurrencyMargin\":\""+SymbolInfoString(symbolSYMBOL_CURRENCY_MARGIN)+"\","+
               "\n"+indent3+"\"ColorBackground\":\""+ColorToString((color)SymbolInfoInteger(symbolSYMBOL_BACKGROUND_COLOR))+"\","+
               "\n"+indent3+"\"Digits\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_DIGITS))+"\","+
               "\n"+indent3+"\"Point\":\""+DoubleToString(SymbolInfoDouble(symbolSYMBOL_POINT), digits)+"\","+
               "\n"+indent3+"\"TickBookDepth\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TICKS_BOOKDEPTH))+"\","+
               "\n"+indent3+"\"ChartMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_CHART_MODE))+"\","+
               "\n"+indent3+"\"TradeMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_EXEMODE))+"\","+
               "\n"+indent3+"\"TradeCalcMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_CALC_MODE))+"\","+
               "\n"+indent3+"\"OrderMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_ORDER_MODE))+"\","+
               "\n"+indent3+"\"CalculationMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_CALC_MODE))+"\","+
               "\n"+indent3+"\"ExecutionMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_EXEMODE))+"\","+
               "\n"+indent3+"\"ExpirationMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_EXPIRATION_MODE))+"\","+
               "\n"+indent3+"\"FillFlags\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_FILLING_MODE))+"\","+
               "\n"+indent3+"\"ExpirFlags\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_EXPIRATION_MODE))+"\","+
               "\n"+indent3+"\"Spread\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_SPREAD))+"\","+
               "\n"+indent3+"\"TickValue\":\""+StringFormat("%G", (SymbolInfoDouble(symbolSYMBOL_TRADE_TICK_VALUE)))+"\","+
               "\n"+indent3+"\"TickSize\":\""+StringFormat("%G", (SymbolInfoDouble(symbolSYMBOL_TRADE_TICK_SIZE)))+"\","+
               "\n"+indent3+"\"ContractSize\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_TRADE_CONTRACT_SIZE)))+"\","+
               "\n"+indent3+"\"StopsLevel\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_STOPS_LEVEL))+"\","+
               "\n"+indent3+"\"VolumeMin\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_MIN)))+"\","+
               "\n"+indent3+"\"VolumeMax\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_MAX)))+"\","+
               "\n"+indent3+"\"VolumeStep\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_STEP)))+"\","+
               "\n"+indent3+"\"VolumeLimit\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_STEP)))+"\","+
               "\n"+indent3+"\"SwapMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_SWAP_MODE))+"\","+
               "\n"+indent3+"\"SwapLong\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_SWAP_LONG)))+"\","+
               "\n"+indent3+"\"SwapShort\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_SWAP_SHORT)))+"\","+
               "\n"+indent3+"\"Swap3Day\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_SWAP_ROLLOVER3DAYS))+"\""+
               "\n"+indent2+"}"+
               "\n"+indent1+"]"+
               "\n}";
   return(json);
  }
//+------------------------------------------------------------------+
//| Forme une indentation composée d'espaces                         |
//+------------------------------------------------------------------+
string Indent(const int number, const int characters=3)
  {
   int length=number*characters;
   string indent=NULL;
   StringInit(indent, length, ' ');
   return indent;
  }
/*
 Résultat :
 Base de données : symbols.sqlite ouverte avec succès
  #| cid name        type notnull dflt_value pk
  -+-------------------------------------------
  1|   0 NAME        TEXT       1             0 
  2|   1 DESCRIPTION TEXT       0             0 
  3|   2 PATH        TEXT       0             0 
  4|   3 SPREAD      INT        0             0 
  5|   4 POINT       REAL       1             0 
  6|   5 DIGITS      INT        1             0 
  7|   6 JSON        BLOB       0             0 
 1: EURUSD ajouté
 2: GBPUSD ajouté
 3: USDCHF ajouté
  ...
 82: USDCOP ajouté
 83: USDARS ajouté
 84: USDCLP ajouté
 Table SYMBOLS : 84 symboles ajoutés
 Base de données : table SYMBOLS sauvée dans symbols.csv
 Base de données : symbols.sqlite créée et fermée
*/
 

Voir aussi

DatabasePrepare, DatabaseBind, DatabaseBindArray, DatabaseFinalize