DatabaseExport

Esporta una tabella o un risultato di esecuzione di una richiesta SQL in un file CSV. Il file viene creato in codifica UTF-8.

long  DatabaseExport(
   int           database,           // handle di database ricevuto in DatabaseOpen
   const string  table_or_sql,       // un nome tabella o una richiesta SQL
   const string  filename,           // un nome di un file CSV per l'esportazione dei dati
   uint          flags,              // combinazione di bandiere
   const string  separator           // separatore di dati nel file CSV
   );

Parametri

database

[in] Handle database ricevuto in DatabaseOpen().

table_or_sql

[in] Il nome di una tabella o un testo di una richiesta SQL i cui risultati devono essere esportati in un file specificato.

filename

[in] Il nome file per l'esportazione dei dati. Il percorso è impostato rispetto alla cartella MQL5\Files.

flags

[in]  Combinazione di flag dall'enumerazione ENUM_DATABASE_EXPORT_FLAGS.

separator

[in] Separatore di dati. Se si specifica NULL, viene utilizzato come separatore il carattere di tabulazione '\t'. Una stringa vuota "" è considerata un separatore valido ma il file CSV ottenuto non può essere letto come una tabella - è considerato come un insieme di stringhe.

 

Valore di Ritorno

Restituisce il numero di voci esportate o un valore negativo in caso di errore. Per ottenere il codice di errore, utilizzare GetLastError(), le possibili risposte sono:

  • ERR_INTERNAL_ERROR (4001)                       – errore critico di runtime;
  • ERR_INVALID_PARAMETER (4003)                  – il percorso del file di database contiene una stringa vuota o viene impostata una combinazione incompatibile di flag;
  • ERR_NOT_ENOUGH_MEMORY (4004)              - memoria insufficiente;
  • ERR_FUNCTION_NOT_ALLOWED(4014)           – la pipe specificata non è consentita;
  • ERR_PROGRAM_STOPPED(4022)                    – operazione annullata (programma MQL interrotto);
  • ERR_WRONG_FILENAME (5002)                     - nome file non valido;
  • ERR_TOO_LONG_FILENAME (5003)                 - il percorso assoluto del file supera la lunghezza massima;
  • ERR_CANNOT_OPEN_FILE(5004)                    – impossibile aprire il file per la scrittura;
  • ERR_FILE_WRITEERROR(5026)                      – impossibile scrivere nel file;
  • ERR_DATABASE_INTERNAL (5120)                 – errore interno al database;
  • ERR_DATABASE_INVALID_HANDLE (5121)      - handle di database non valido;
  • ERR_DATABASE_QUERY_PREPARE(5125)        – errore di generazione richiesta;
  • ERR_DATABASE_QUERY_NOT_READONLY       – la richiesta di sola lettura è consentita.

 

Nota

Se i risultati della richiesta vengono esportati, la richiesta SQL dovrebbe iniziare con "SELECT" o "select". In altre parole, la richiesta SQL non può modificare lo stato del database, altrimenti DatabaseExport() fallisce con un errore.

I valori delle stringhe del database possono contenere il carattere di conversione ('\r' o '\r \n'), nonché il set di caratteri del separatore di valori nel parametro separator. In questo caso, assicurarsi di utilizzare il flag DATABASE_EXPORT_QUOTED_STRINGS nel parametro 'flags'. Se questo flag è presente, tutte le stringhe visualizzate sono racchiuse tra virgolette doppie. Se una stringa contiene una virgoletta doppia, viene sostituita da due virgolette doppie.

 

ENUM_DATABASE_EXPORT_FLAGS

ID

Descrizione

DATABASE_EXPORT_HEADER

Visualizza i nomi dei campi nella prima stringa

DATABASE_EXPORT_INDEX

Visualizza gli indici delle stringhe

DATABASE_EXPORT_NO_BOM

Non inserire il contrassegno BOM all'inizio del file (di default BOM è inserito)

DATABASE_EXPORT_CRLF

Usa CRLF per l'interruzione di stringa (l'impostazione predefinita è LF)

DATABASE_EXPORT_APPEND

Aggiunge dati alla fine di un file esistente (per impostazione predefinita, il file viene sovrascritto). Se il file non esiste, verrà creato.

DATABASE_EXPORT_QUOTED_STRINGS

Visualizza i valori delle stringhe tra doppie virgolette.

DATABASE_EXPORT_COMMON_FOLDER

Un file CSV viene creato nella cartella common di tutti i terminali client \Terminal\Common\File.

 

Esempio:

input int InpRates=100;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  MqlRates rates[];
//--- ricordare l'ora di inizio prima della ricezione delle barre
  ulong start=GetMicrosecondCount();
//--- richiedere le ultime 100 barre su H1
  if(CopyRates(Symbol(), PERIOD_H11InpRatesrates)<InpRates)
   {
    Print("CopyRates() failed,, Error "GetLastError());
    return;
   }
  else
   {
    //---quante barre sono state ricevute e quanto tempo ci è voluto per riceverle
    PrintFormat("%s: CopyRates received %d bars in %d ms ",
                _SymbolArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- impostare il nome del file per la memorizzazione del database
  string filename=_Symbol+"_"+EnumToString(PERIOD_H1)+"_"+TimeToString(TimeCurrent())+".sqlite";
  StringReplace(filename":""-"); // ":" character is not allowed in file names
//--- aprire/creare il database nella cartella common del terminale
  int db=DatabaseOpen(filenameDATABASE_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");
 
//--- controlla se la tabella RATES esiste
  if(DatabaseTableExists(db"RATES"))
   {
    //--- rimuove la tabella RATES
    if(!DatabaseExecute(db"DROP TABLE IF EXISTS RATES"))
     {
      Print("Failed to drop the RATES table with code "GetLastError());
      DatabaseClose(db);
      return;
     }
   }
//--- crea la tabella 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" create table RATES with code "GetLastError());
    DatabaseClose(db);
    return;
   }
//--- visualizza l'elenco di tutti i campi della tabella RATES
  if(DatabasePrint(db"PRAGMA TABLE_INFO(RATES)"0)<0)
   {
    PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(RATES)\") failed, error code=%d at line %d"GetLastError(), __LINE__);
    DatabaseClose(db);
    return;
   }
//--- creare una richiesta parametrizzata per aggiungere barre alla tabella 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)"// parametri richiesti
  int request=DatabasePrepare(dbsql);
  if(request==INVALID_HANDLE)
   {
    PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
    Print("SQL request: "sql);
    DatabaseClose(db);
    return;
   }
//--- impostare il valore del primo parametro di richiesta
  DatabaseBind(request0_Symbol);
//--- ricordare l'ora di inizio prima dell'aggiunta delle barre
  start=GetMicrosecondCount();
  DatabaseTransactionBegin(db);
  int total=ArraySize(rates);
  bool request_error=false;
  for(int i=0i<totali++)
   {
    //--- impostare i valori dei restanti parametri prima di aggiungere la voce
    ResetLastError();
    if(!DatabaseBind(request1rates[i].time))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    //--- se la precedente chiamata a DatabaseBind() ha avuto esito positivo, impostare il parametro successivo
    if(!request_error && !DatabaseBind(request2rates[i].open))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request3rates[i].high))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request4rates[i].low))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request5rates[i].close))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request6rates[i].tick_volume))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request7rates[i].spread))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request8rates[i].real_volume))
     {
      PrintFormat("DatabaseBind() failed with code=%d"GetLastError());
      PrintFormat("Bar #%d line=%d"i+1__LINE__);
      request_error=true;
      break;
     }
 
    //--- eseguire una richiesta di inserimento della voce e verificare la presenza di un errore
    if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
     {
      PrintFormat("DatabaseRead() failed with code=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
    //--- resettare la richiesta prima del successivo aggiornamento del parametro
    if(!request_error && !DatabaseReset(request))
     {
      PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
   } //--- finito tutte le barre attraversate
 
//--- stato delle transazioni
  if(request_error)
   {
    PrintFormat("Table RATES: failed to add %d bars "ArraySize(rates));
    DatabaseTransactionRollback(db);
    DatabaseClose(db);
    return;
   }
  else
   {
    DatabaseTransactionCommit(db);
    PrintFormat("Table RATES: added %d bars in %d ms",
                ArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- salva la tabella RATES in un file 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 saved in "Symbol(), ".csv");
  else
    Print("DatabaseExport() failed. Error "GetLastError());
//--- chiude il file del database e lo comunica
  DatabaseClose(db);
  PrintFormat("Database: %s created and closed"filename);

Guarda anche

DatabasePrint, DatabaseImport