DatabaseExport

Exporte une table ou le résultat de l'exécution d'une requête SQL dans un fichier CSV. Le fichier est créé avec un encodage en UTF-8.

long  DatabaseExport(
   int           database,           // handle de la base de données obtenu avec DatabaseOpen
   const string  table_or_sql,       // nom d'une table ou requête SQL
   const string  filename,           // nom d'un fichier CSV pour l'export des données
   uint          flags,              // combinaison de flags
   const string  separator           // séparateur de données dans le fichier CSV
   );

Paramètres

database

[in]  Handle de la base de données obtenu avec DatabaseOpen().

table_or_sql

[in]   Le nom d'une table ou le texte d'une requête SQL dont les résultats sont à exporter vers le fichier spécifié.

filename

[in]  Nom d'un fichier pour l'export des données. Le chemin est relatif au répertoire MQL5\Files.

flags

[in]  Combinaison des flags de l'énumération ENUM_DATABASE_EXPORT_FLAGS.

separator

[in]  Séparateur de données. Si NULL est spécifié, le caractère '\t' de tabulation est utilisé comme séparateur. Une chaîne vide "" est considérée comme un séparateur valide, mais le fichier CSV ne pourra pas être lu sous forme de table — il sera considéré comme étant une suite de chaînes de caractères.

 

Valeur de Retour

Retourne le nombre d'entrées exporteés ou une valeur négative en cas d'erreur. Pour obtenir le code d'erreur, utilisez GetLastError(), les réponses possibles sont :

  • ERR_INTERNAL_ERROR (4001)                       — erreur critique d'exécution ;
  • ERR_INVALID_PARAMETER (4003)                  — chemin vers le fichier de base de données contenant une chaîne vide, ou combinaison invalide de flags ;
  • ERR_NOT_ENOUGH_MEMORY (4004)              - mémoire insuffisante ;
  • ERR_FUNCTION_NOT_ALLOWED(4014)           — le pipe spécifié n'est pas autorisé ;
  • ERR_PROGRAM_STOPPED(4022)                    — opération annulée (le programme MQL s'est stoppé) ;
  • ERR_WRONG_FILENAME (5002)                     - nom de fichier invalide ;
  • ERR_TOO_LONG_FILENAME (5003)                 - la taille du chemin absolu est supérieure à la longueur maximum ;
  • ERR_CANNOT_OPEN_FILE(5004)                    — impossible d'ouvrir le fichier en écriture ;
  • ERR_FILE_WRITEERROR(5026)                      — impossible d'écrire vers le fichier ;
  • ERR_DATABASE_INTERNAL (5120)                 — erreur interne de la base de données ;
  • ERR_DATABASE_INVALID_HANDLE (5121)      - handle invalide de la base de données ;
  • ERR_DATABASE_QUERY_PREPARE(5125)        — erreur de génération de la requête ;
  • ERR_DATABASE_QUERY_NOT_READONLY       — seules les requêtes en lecture seule sont autorisées.

 

Note

Si les résultats de la requête doivent être exportés, la requête SQL doit commencer avec "SELECT" ou "select". En d'autres termes, la requête SQL ne peut pas modifier le statut de la base de données, sinon DatabaseExport() échouera avec une erreur.

Les valeurs des chaînes de caractères de la base de données peuvent contenir des caractères de conversion ('\r' ou '\r\n' ), ainsi que les caractères de séparation définis dans le paramètre separator. Dans ce cas, assuez-vous d'utiliser le flag DATABASE_EXPORT_QUOTED_STRINGS dans le paramètre 'flags'. Si ce flag est présent, toutes les chaînes de caractères sont placées entre guillemets. Si une chaîne de caractères contient un guillemet, il sera remplacé par 2 guillemets.

 

ENUM_DATABASE_EXPORT_FLAGS

Identifiant

Description

DATABASE_EXPORT_HEADER

Affiche les noms des champs dans la première chaîne

DATABASE_EXPORT_INDEX

Affiche les index

DATABASE_EXPORT_NO_BOM

N'insère pas la marque BOM au début du fichier (la BOM est insérée par défaut)

DATABASE_EXPORT_CRLF

Utilise CRLF pour le retour à la ligne (la valeur par défaut sinon est LF)

DATABASE_EXPORT_APPEND

Ajoute les données à la fin d'un fichier existante (par défaut, le fichier est écrasé). Si le fichier n'existe pas, il sera créé.

DATABASE_EXPORT_QUOTED_STRINGS

Exporte les chaînes de caractères entre guillemets.

DATABASE_EXPORT_COMMON_FOLDER

Un fichier CSV est créé dans le dossier commun de tous les terminaux clients \Terminal\Common\File.

 

Exemple :

input int InpRates=100;
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme                               |
//+------------------------------------------------------------------+
void OnStart()
 {
  MqlRates rates[];
//--- stocke l'heure de début avant d'obtenir les barres
  ulong start=GetMicrosecondCount();
//--- récupère les 100 dernières barres sur H1
  if(CopyRates(Symbol(), PERIOD_H11InpRatesrates)<InpRates)
   {
    Print("Echec de CopyRates(), erreur "GetLastError());
    return;
   }
  else
   {
    //--- combien de barres ont été récupérées et combien de temps il a fallu pour les recevoir
    PrintFormat("%s: CopyRates a reçu %d barres en %d ms ",
                _SymbolArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- définit le nom du fichier pour stocker la base de données
  string filename=_Symbol+"_"+EnumToString(PERIOD_H1)+"_"+TimeToString(TimeCurrent())+".sqlite";
  StringReplace(filename":""-"); // le caractère ":" n'est pas autorisé dans les noms de fichiers
//--- ouvre/crée la base de données dans le répertoire commun du terminal
  int db=DatabaseOpen(filenameDATABASE_OPEN_READWRITE|DATABASE_OPEN_CREATE|DATABASE_OPEN_COMMON);
  if(db==INVALID_HANDLE)
   {
    Print("Base de données : "filename" échec de l'ouverture, code d'erreur : "GetLastError());
    return;
   }
  else
    Print("Base de données : "filename" ouvert avec succès");
 
//--- vérifie si la table RATES existe
  if(DatabaseTableExists(db"RATES"))
   {
    //--- supprime la table RATES
    if(!DatabaseExecute(db"DROP TABLE IF EXISTS RATES"))
     {
      Print("Echec de la suppression de la table RATES, code d'erreur :"GetLastError());
      DatabaseClose(db);
      return;
     }
   }
//--- crée la table RATES
  if(!DatabaseExecute(db"CREATE TABLE RATES("
                      "SYMBOL             CHAR(10),"
                      "TIME               INT NOT NULL,"
                      "OPEN               REAL,"
                      "HIGH               REAL,"
                      "LOW                REAL,"
                      "CLOSE              REAL,"
                      "TICK_VOLUME        INT,"
                      "SPREAD             INT,"
                      "REAL_VOLUME        INT);"))
   {
    Print("DB: "filename" échec de la création de la table RATES, code d'erreur :"GetLastError());
    DatabaseClose(db);
    return;
   }
//--- affiche la liste de tous les champs de la table RATES
  if(DatabasePrint(db"PRAGMA TABLE_INFO(RATES)"0)<0)
   {
    PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(RATES)\") a échoué, code d'erreur=%d à la ligne %d"GetLastError(), __LINE__);
    DatabaseClose(db);
    return;
   }
//--- crée une requête paramétrée pour ajouter les barres à la table RATES
  string sql="INSERT INTO RATES (SYMBOL,TIME,OPEN,HIGH,LOW,CLOSE,TICK_VOLUME,SPREAD,REAL_VOLUME)"
             " VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9)"// paramètres de la requête
  int request=DatabasePrepare(dbsql);
  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(request0_Symbol);
//--- stocke l'heure de début avant d'ajouter des barres à la table RATES
  start=GetMicrosecondCount();
  DatabaseTransactionBegin(db);
  int total=ArraySize(rates);
  bool request_error=false;
  for(int i=0i<totali++)
   {
    //--- définit les valeurs des paramètres restants avant d'ajouter l'entrée
    ResetLastError();
    if(!DatabaseBind(request1rates[i].time))
     {
      PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
      PrintFormat("Barre #%d ligne=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    //--- si le dernier appel à DatabaseBind() a réussi, définit le paramètre suivant
    if(!request_error && !DatabaseBind(request2rates[i].open))
     {
      PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
      PrintFormat("Barre #%d ligne=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request3rates[i].high))
     {
      PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
      PrintFormat("Barre #%d ligne=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request4rates[i].low))
     {
      PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
      PrintFormat("Barre #%d ligne=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request5rates[i].close))
     {
      PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
      PrintFormat("Barre #%d ligne=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request6rates[i].tick_volume))
     {
      PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
      PrintFormat("Barre #%d ligne=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request7rates[i].spread))
     {
      PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
      PrintFormat("Barre #%d ligne=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request8rates[i].real_volume))
     {
      PrintFormat("DatabaseBind() a échoué avec le code=%d"GetLastError());
      PrintFormat("Barre #%d ligne=%d"i+1__LINE__);
      request_error=true;
      break;
     }
 
    //--- exécute une requête pour insérer l'entrée et rechercher une 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;
     }
   } //--- fin du parcours toutes les barres
 
//--- état des transactions
  if(request_error)
   {
    PrintFormat("Table RATES : échec de l'ajout des %d barres "ArraySize(rates));
    DatabaseTransactionRollback(db);
    DatabaseClose(db);
    return;
   }
  else
   {
    DatabaseTransactionCommit(db);
    PrintFormat("Table RATES : %d barres ajoutées en %d ms",
                ArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- sauvegarde la table RATES dans un fichier CSV
  string csv_filename=Symbol()+".csv";
  long saved=DatabaseExport(db"SELECT * FROM RATES"csv_filenameDATABASE_EXPORT_HEADER|DATABASE_EXPORT_INDEX|DATABASE_EXPORT_COMMON_FOLDER";");
  if(saved>0)
    Print("Table RATES sauvegardée dans le fichier "Symbol(), ".csv");
  else
    Print("DatabaseExport() a échoué. Erreur "GetLastError());
//--- ferme la base de données
  DatabaseClose(db);
  PrintFormat("Base de données : %s créée et fermée avec succès"filename);

 

Voir aussi

DatabasePrint, DatabaseImport