DatabaseExport

Exporta uma tabela ou resultado sobre a execução da consulta SQL para um arquivo CSV. O arquivo é criado com codificação UTF-8.

long  DatabaseExport(
   int           database,           // identificador de banco de dados recebido em DatabaseOpen
   const string  table_or_sql,       // nome da tabela ou consulta SQL
   const string  filename,           // nome do arquivo CSV para exportação de dados
   uint          flags,              // combinação de sinalizadores
   const string  separator           // separador de dados no arquivo CVS
   );

Parâmetros

database

[in]  Identificador do banco de dados, obtido em DatabaseOpen().

table_or_sql

[in]  Nome da tabela ou o texto da consulta SQL, cujos resultados serão exportados para o arquivo especificado.

filename

[in]  Nome do arquivo para exportar dados. O caminho é definido em relação à pasta MQL5\Files.

flags

[in]  Combinação de sinalizadores a partir da enumeração ENUM_DATABASE_EXPORT_FLAGS.

separator

[in]  Separador de dados. Se especificado NULL, como separador será utilizado o símbolo de tabulação '\t'. Linha vazia "" é considerada um delimitador válido, mas o arquivo CSV não pode ser lido como tabela, pois será um conjunto de linhas.

 

Valor retornado

Retorna o número de registros exportados ou um valor negativo em caso de erro. Para obter o código de erro, use GetLastError(), respostas possíveis:

  • ERR_INTERNAL_ERROR (4001)                       — erro crítico de tempo de execução do sistema;
  • ERR_INVALID_PARAMETER (4003)                  — caminho para o arquivo de banco de dados contendo uma string vazia ou definida uma combinação incompatível de sinalizadores;
  • ERR_NOT_ENOUGH_MEMORY (4004)             — memória insuficiente;
  • ERR_FUNCTION_NOT_ALLOWED(4014)           — o canal especificado não é permitido;
  • ERR_PROGRAM_STOPPED(4022)                    — operação cancelada (o programa MQL parou);
  • ERR_WRONG_FILENAME (5002)                     - nome de arquivo inválido;
  • ERR_TOO_LONG_FILENAME (5003)                 - o caminho absoluto para o arquivo excedeu o tamanho máximo;
  • ERR_CANNOT_OPEN_FILE(5004)                    — erro ao abrir o arquivo para gravação;
  • ERR_FILE_WRITEERROR(5026)                      — erro ao gravar no arquivo;
  • ERR_DATABASE_INTERNAL (5120)                 — erro interno do banco de dados;
  • ERR_DATABASE_INVALID_HANDLE (5121)      — identificador de banco de dados inválido;
  • ERR_DATABASE_QUERY_PREPARE(5125)        — erro ao criar a consulta;
  • ERR_DATABASE_QUERY_NOT_READONLY       — somente é permitida uma solicitação de leitura.

 

Observação

Se os resultados da consulta forem exportados, a consulta SQL deverá começar com "SELECT" ou "select". Em outras palavras, a consulta SQL não pode alterar o estado do banco de dados, caso contrário DatabaseExport() falhará.

Os valores de string no banco de dados podem conter um caractere de conversão ('\r' ou '\r\n' ), além de um caractere separador de valores especificado no parâmetro separator. Nesse caso, é necessário usar o sinalizador DATABASE_EXPORT_QUOTED_STRINGS no parâmetro flags. Se esse sinalizador estiver presente, todas as linhas exibidas serão colocadas entre aspas duplas, mas se a linha contiver aspas duplas, ela será substituída por duas aspas duplas.

 

ENUM_DATABASE_EXPORT_FLAGS

Identificador

Descrição

DATABASE_EXPORT_HEADER

Exibe os nomes dos campos na primeira linha

DATABASE_EXPORT_INDEX

Exibe os números das linhas

DATABASE_EXPORT_NO_BOM

Não insere uma etiqueta BOM no início do arquivo (a BOM é inserida por padrão)

DATABASE_EXPORT_CRLF

Usa CRLF (por padrão, LF) para quebras de linha

DATABASE_EXPORT_APPEND

Adiciona dados ao final de um arquivo existente (por padrão, o arquivo é sobregravado). Se o arquivo não existir, ele será criado.

DATABASE_EXPORT_QUOTED_STRINGS

Exibe valores de string em aspas duplas.

DATABASE_EXPORT_COMMON_FOLDER

O arquivo CSV será criado na pasta compartilhada de todos os terminais \Terminal\Common\File.

 

Exemplo:

input int InpRates=100;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  MqlRates rates[];
//--- lembramos a hora de início antes de obter as barras
  ulong start=GetMicrosecondCount();
//--- solicitamos as últimas 100 barras no período gráfico H1
  if(CopyRates(Symbol(), PERIOD_H11InpRatesrates)<InpRates)
   {
    Print("CopyRates() failed,, Error "GetLastError());
    return;
   }
  else
   {
    //--- quantidade de barras e em quanto tempo elas foram recebidas
    PrintFormat("%s: CopyRates received %d bars in %d ms ",
                _SymbolArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- formamos o nome do arquivo para armazenar o banco de dados
  string filename=_Symbol+"_"+EnumToString(PERIOD_H1)+"_"+TimeToString(TimeCurrent())+".sqlite";
  StringReplace(filename":""-"); // o símbolo ":" é proibido nos nomes dos arquivos
//--- abrimos/criamos um banco de dados na pasta comum do terminal
  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");
 
//--- verificamos a presença da tabela RATES
  if(DatabaseTableExists(db"RATES"))
   {
    //--- removemos a tabela RATES
    if(!DatabaseExecute(db"DROP TABLE IF EXISTS RATES"))
     {
      Print("Failed to drop the RATES table with code "GetLastError());
      DatabaseClose(db);
      return;
     }
   }
//--- criamos a tabela 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;
   }
//--- mostramos a lista de todos os campos na tabela 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;
   }
//--- criamos uma consulta parametrizada para adicionar barras à tabela 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)"// parâmetros da consulta
  int request=DatabasePrepare(dbsql);
  if(request==INVALID_HANDLE)
   {
    PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
    Print("SQL request: "sql);
    DatabaseClose(db);
    return;
   }
//--- definimos o valor do primeiro parâmetro de consulta
  DatabaseBind(request0_Symbol);
//--- lembramos a hora de início antes de adicionar as barras à tabela RATES
  start=GetMicrosecondCount();
  DatabaseTransactionBegin(db);
  int total=ArraySize(rates);
  bool request_error=false;
  for(int i=0i<totali++)
   {
    //--- definimos o resto dos parâmetros antes de adicionar uma entrada
    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 a chamada anterior de DatabaseBind() foi bem sucedida, definimos o seguinte parâmetro
    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;
     }
 
    //--- executamos uma solicitação para inserir um registro e verificar a existência de erros
    if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
     {
      PrintFormat("DatabaseRead() failed with code=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
    //--- reinicializamos a solicitação para o estado inicial antes da próxima atualização do parâmetro
    if(!request_error && !DatabaseReset(request))
     {
      PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
   } //--- terminamos, percorremos todas as barras
 
//--- como correram as operações?
  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);
   }
//--- salvamos a tabela RATES em um arquivo 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());
//--- fechamos o arquivo do banco de dados e relatamos isso
  DatabaseClose(db);
  PrintFormat("Database: %s created and closed"filename);

Veja também

DatabasePrint, DatabaseImport