DatabaseExport

Экспортирует таблицу или результат выполнения SQL-запроса в CSV-файл. Файл создается в кодировке UTF-8.

long  DatabaseExport(
   int           database,           // хендл базы данных, полученный в DatabaseOpen
   const string  table_or_sql,       // имя таблицы или SQL-запрос
   const string  filename,           // имя CSV-файла для экспорта данных
   uint          flags,              // комбинация флагов
   const string  separator           // разделитель данных в CSV-файле
   );

Параметры

database

[in]  Хендл базы данных, который получен в DatabaseOpen().

table_or_sql

[in]  Имя таблицы или текст SQL-запроса, результаты которого будут экспортированы в указанный файл.

filename

[in]  Имя файла для экспорта данных. Путь задается относительно папки MQL5\Files.

flags

[in]  Комбинация флагов из перечисления ENUM_DATABASE_EXPORT_FLAGS.

separator

[in]  Разделитель данных. Если указан NULL, то в качестве разделителя будет использоваться символ табуляции '\t'.  Пустая строка "" считается допустимым разделителем, но полученный CSV-файл не может быть прочитан как таблица – это будет набор строк.

 

Возвращаемое значение

Возвращает количество экспортированных записей  или отрицательное значение в случае ошибки. Для получения кода ошибки используйте GetLastError(), возможные ответы:

  • ERR_INTERNAL_ERROR (4001)                       – критическая ошибка исполняющей системы;
  • ERR_INVALID_PARAMETER (4003)                  – путь к файлу базы содержит пустую строку или выставлена несовместимая комбинация флагов;
  • ERR_NOT_ENOUGH_MEMORY (4004)              - недостаточно памяти;
  • ERR_FUNCTION_NOT_ALLOWED(4014)           – указанный пайп не разрешён;
  • ERR_PROGRAM_STOPPED(4022)                    – операция отменена (произошла остановка MQL программы);
  • ERR_WRONG_FILENAME (5002)                     - некорректное имя файла;
  • ERR_TOO_LONG_FILENAME (5003)                 - абсолютный путь к файлу превысил максимальную длину;
  • ERR_CANNOT_OPEN_FILE(5004)                    – ошибка открытия файла на запись;
  • ERR_FILE_WRITEERROR(5026)                      – ошибка записи в файл;
  • ERR_DATABASE_INTERNAL (5120)                 – внутренняя ошибка базы данных;
  • ERR_DATABASE_INVALID_HANDLE (5121)      - невалидный хендл базы данных;
  • ERR_DATABASE_QUERY_PREPARE(5125)        – ошибка создания запроса;
  • ERR_DATABASE_QUERY_NOT_READONLY       – разрешен только запрос на чтение.

 

Примечание

Если экспортируются результаты запроса, то SQL-запрос должен начинаться с "SELECT" или "select". Другими словами, SQL-запрос не может изменять состояние базы данных, в противном случае DatabaseExport() завершится ошибкой.

Строковые значения в базе данных могут содержать символ перевода ('\r' или '\r\n' ), а также символ разделителя значений, заданный в параметре separator. В этом случае нужно обязательно использовать флаг DATABASE_EXPORT_QUOTED_STRINGS в параметре flags. При наличии этого флага все выводимые строки будут заключены в двойные кавычки, если же в строке содержится двойная кавычка, то она будет заменена на две двойные кавычки.

 

ENUM_DATABASE_EXPORT_FLAGS

Идентификатор

Описание

DATABASE_EXPORT_HEADER

Выводить имена полей в первой строке

DATABASE_EXPORT_INDEX

Выводить номера строк

DATABASE_EXPORT_NO_BOM

Не вставлять метку BOM в начале файла (по умолчанию BOM вставляется)

DATABASE_EXPORT_CRLF

Для переноса строки использовать CRLF (по умолчанию LF)

DATABASE_EXPORT_APPEND

Дописывать данные в конец существующего файла (по умолчанию файл перезаписывается). Если файл не существует, то он будет создан.

DATABASE_EXPORT_QUOTED_STRINGS

Выводить строковые значения в двойных кавычках.

DATABASE_EXPORT_COMMON_FOLDER

CSV-файл будет создан в общей папке всех клиентских терминалов \Terminal\Common\File.

 

Пример:

input int InpRates=100;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  MqlRates rates[];
//--- запомним время старта перед получением баров
  ulong start=GetMicrosecondCount();
//--- запросим последние 100 баров на тайфрейме H1
  if(CopyRates(Symbol(), PERIOD_H11InpRatesrates)<InpRates)
   {
    Print("CopyRates() failed,, Error "GetLastError());
    return;
   }
  else
   {
    //--- сколько баров и за какое время получили
    PrintFormat("%s: CopyRates received %d bars in %d ms ",
                _SymbolArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- составим имя файла для хранения базы данных
  string filename=_Symbol+"_"+EnumToString(PERIOD_H1)+"_"+TimeToString(TimeCurrent())+".sqlite";
  StringReplace(filename":""-"); // символ ":" запрещен в названиях файлов
//--- открываем/создаем базу данных в общей папке терминалов
  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");
 
//--- проверим наличие таблицы RATES
  if(DatabaseTableExists(db"RATES"))
   {
    //--- удалим таблицу RATES
    if(!DatabaseExecute(db"DROP TABLE IF EXISTS RATES"))
     {
      Print("Failed to drop the RATES table with code "GetLastError());
      DatabaseClose(db);
      return;
     }
   }
//--- создаем таблицу 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;
   }
//--- покажем список всех полей в таблице 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;
   }
//--- создадим параметризованный запрос добавления баров в таблицу 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)"// параметры запроса
  int request=DatabasePrepare(dbsql);
  if(request==INVALID_HANDLE)
   {
    PrintFormat("DatabasePrepare() failed with code=%d"GetLastError());
    Print("SQL request: "sql);
    DatabaseClose(db);
    return;
   }
//--- установим значение первого параметра запроса
  DatabaseBind(request0_Symbol);
//--- запомним время старта перед добавлением баров в таблицу RATES
  start=GetMicrosecondCount();
  DatabaseTransactionBegin(db);
  int total=ArraySize(rates);
  bool request_error=false;
  for(int i=0i<totali++)
   {
    //--- устанавливаем значения остальных параметров перед добавлением записи
    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;
     }
    //--- если предыдущий вызов DatabaseBind() прошел успешно, то установим следующий параметр
    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;
     }
 
    //--- выполним запрос на вставку записи и проверим на ошибку
    if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
     {
      PrintFormat("DatabaseRead() failed with code=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
    //--- сбросим запрос в начальное состояние перед следующим обновлением параметров
    if(!request_error && !DatabaseReset(request))
     {
      PrintFormat("DatabaseReset() failed with code=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
   } //--- закончили, прошли по всем барам
 
//--- как прошли транзакции?
  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);
   }
//--- сохраним таблицу RATES в 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());
//--- закроем файл с базой данных и сообщим об этом
  DatabaseClose(db);
  PrintFormat("Database: %s created and closed"filename);
 }

Смотри также

DatabasePrint, DatabaseImport