DatabaseExport

Exportiert eine Tabelle oder das Ergebnis einer SQL-Anfrage in eine CSV-Datei. Die erstellte Datei ist in UTF-8 encodiert.

long  DatabaseExport(
   int           database,           // Handle der Datenbank, erhalten von DatabaseOpen
   const string  table_or_sql,       // ein Tabellenname oder eine SQL-Anfrage
   const string  filename,           // der Name der CSV-Datei für den Datenexport
   uint          flags,              // Kombination der Flags
   const string  separator           // Trennzeichen in der CSV-Datei
   );

Parameter

database

[in]  Handle der Datenbank, erhalten von DatabaseOpen().

table_or_sql

[in]   Ein Name einer Tabelle oder ein Text einer SQL-Anfrage, deren Ergebnisse in eine bestimmte Datei exportiert werden sollen.

filename

[in]  Ein Dateiname für den Datenexport. Der Pfad wird relativ zum Ordner MQL5\Files festgelegt.

flags

[in] Kombination von Flags aus der Enumeration ENUM_DATABASE_EXPORT_FLAGS.

separator

[in]  Trennzeichen der Daten. Wenn NULL angegeben wurde, wird der Tabulator '\t' als Trennzeichen verwendet.  Eine leere Zeichenkette "" wird als gültiges Trennzeichen betrachtet, aber die erhaltene CSV-Datei kann nicht als Tabelle gelesen werden - sie wird als eine Reihe von Zeichenfolgen betrachtet.

 

Rückgabewert

Anzahl der exportierten Einträge oder im Fehlerfall einen negativen Wert. Um den Fehlercode zu erhalten, verwenden Sie GetLastError(), die möglichen Antworten sind:

  • ERR_INTERNAL_ERROR (4001)                       – kritischer Laufzeitfehler;
  • ERR_INVALID_PARAMETER (4003)                  – Der Pfad zur Datenbankdatei ist leer oder es wurde eine inkompatible Kombination der Flags übergeben;
  • ERR_NOT_ENOUGH_MEMORY (4004)              - ungenügend Speicher;
  • ERR_FUNCTION_NOT_ALLOWED(4014)           – angegebene Pipe ist nicht erlaubt;
  • ERR_PROGRAM_STOPPED(4022)                    – Operation abgebrochen (MQL-Programm gestoppt);
  • ERR_WRONG_FILENAME (5002)                     - Ungültiger Dateiname;
  • ERR_TOO_LONG_FILENAME (5003)                 - absoluter Pfad überschreitet die Maximallänge;
  • ERR_CANNOT_OPEN_FILE(5004)                    – Datei konnte nicht zum Schreiben geöffnet werden;
  • ERR_FILE_WRITEERROR(5026)                      – In die Datei konnte nicht geschrieben werden;
  • ERR_DATABASE_INTERNAL (5120)                 – interner Datenbankfehler;
  • ERR_DATABASE_INVALID_HANDLE (5121)      - ungültiges Handle der Datenbank;
  • ERR_DATABASE_QUERY_PREPARE(5125)        – Fehler bei der Anfrageerstellung;
  • ERR_DATABASE_QUERY_NOT_READONLY       – es sind Nur-Lese-Anfragen erlaubt.

 

Hinweis

Wenn die Abfrageergebnisse exportiert werden, sollte die SQL-Abfrage mit "SELECT" oder "select" beginnen. Mit anderen Worten, die SQL-Anfrage kann den Datenbankstatus nicht ändern, andernfalls schlägt DatabaseExport() mit einer Fehlermeldung fehl.

Datenbank-String-Werte können das Konvertierungszeichen ('\r' oder '\r\n' ) sowie den Satz der Trennzeichen für die Werte im Parameter Trenner enthalten. Stellen Sie in diesem Fall sicher, dass Sie das Flag DATABASE_EXPORT_QUOTED_STRINGS im Parameter 'flags' verwenden. Wenn dieses Flag vorhanden ist, werden alle angezeigten Zeichenfolgen in doppelte Anführungszeichen gesetzt. Wenn eine Zeichenkette ein doppeltes Anführungszeichen enthält, wird es durch zwei doppelte Anführungszeichen ersetzt.

ENUM_DATABASE_EXPORT_FLAGS

ID

Beschreibung

DATABASE_EXPORT_HEADER

Feldnamen in der ersten Zeil anzeigen

DATABASE_EXPORT_INDEX

Anzeige des Zeilenindex

DATABASE_EXPORT_NO_BOM

Keine "BOM"-Markierung am Anfang der Datei einfügen (BOM wird standardmäßig eingefügt)

DATABASE_EXPORT_CRLF

CRLF für den Zeilenumbruch verwenden (die Voreinstellung ist LF)

DATABASE_EXPORT_APPEND

Hinzufügen von Daten an das Ende einer bestehenden Datei (standardmäßig wird die Datei überschrieben). Wenn die Datei nicht existiert wird sie erstellt.

DATABASE_EXPORT_QUOTED_STRINGS

Zeichenketten in Anführungszeichen anzeigen.

DATABASE_EXPORT_COMMON_FOLDER

Eine CSV-Datei wird im gemeinsamen Ordner "Common" aller Client-Terminals \Terminal\Common\File erstellt.

 

Beispiel:

input int InpRates=100;
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart()
 {
  MqlRates rates[];
//--- Merken der Startzeit vor dem Empfang der Balken
  ulong start=GetMicrosecondCount();
//--- Abfrage der letzten 100 H1-Balken
  if(CopyRates(Symbol(), PERIOD_H11InpRatesrates)<InpRates)
   {
    Print("CopyRates() ist fehlgeschlagen, Fehler: "GetLastError());
    return;
   }
  else
   {
 //--- wie viele Balken empfangen wurden und wie lange es dauerte, sie zu empfangen
    PrintFormat("%s: CopyRates erhielt %d Balken in %d ms ",
                _SymbolArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- Setzen des Dateinamen zum Speichern der Datenbank
  string filename=_Symbol+"_"+EnumToString(PERIOD_H1)+"_"+TimeToString(TimeCurrent())+".sqlite";
  StringReplace(filename":""-"); // ":" nichterlaubtes Zeichen in Dateinamen
//--- Erstellen/Öffnen einer Datenbank im Verzeichnis Common des Terminals
  int db=DatabaseOpen(filenameDATABASE_OPEN_READWRITE|DATABASE_OPEN_CREATE|DATABASE_OPEN_COMMON);
  if(db==INVALID_HANDLE)
   {
    Print("Database: "filename" Öffnen fehlgeschlagen, Fehlernummer: "GetLastError());
    return;
   }
  else
    Print("Database: "filename" erfolgreich geöffnet");
 
//--- Prüfung ob die Tabelle RATES existiert
  if(DatabaseTableExists(db"RATES"))
   {
    //--- Entfernen der Tabelle RATES
    if(!DatabaseExecute(db"TABELLE RATES LÖSCHEN, WENN VORHANDEN"))
     {
      Print("Löschen der Tabelle TEST ist fehlgeschlagen mit der Fehlernummer "GetLastError());
      DatabaseClose(db);
      return;
     }
   }
//--- Erstellen der Tabelle RATES
  if(!DatabaseExecute(db"Erstellen der Tabelle RATES("
                      "SYMBOL             CHAR(10),"
                      "TIME               INT NOT NULL,"
                      "OPEN               REAL,"
                      "HIGH               REAL,"
                      "LOW                REAL,"
                      "CLOSE              REAL,"Nahe am realen 
                      "TICK_VOLUME        INT,"
                      "SPREAD             INT,"
                      "REAL_VOLUME        INT);"))
   {
    Print("DB: "filename" Erstellen der Tabelle RATES, Fehlernummer: "GetLastError());
    DatabaseClose(db);
    return;
   }
//--- Anzeige der Liste aller Felder in der Tabelle RATES
  if(DatabasePrint(db"PRAGMA TABLE_INFO(RATES)"0)<0)
   {
    PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(RATES)\") fehlgeschlagen, Fehlernummer=%d in Zeile %d"GetLastError(), __LINE__);
    DatabaseClose(db);
    return;
   }
//--- Erstellen einer parametrisierten Anfrage zum Hinzufügen von Balken zur Tabelle 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)"// benötigte Parameter
  int request=DatabasePrepare(dbsql);
  if(request==INVALID_HANDLE)
   {
    PrintFormat("DatabasePrepare() fehlgeschlagen, Fehlernummer=%d"GetLastError());
    Print("SQL Anfrage: "sql);
    DatabaseClose(db);
    return;
   }
//--- Setzen des Wertes des ersten Parameters der Anfrage
  DatabaseBind(request0_Symbol);
//--- Merken der Startzeit, bevor die Balken der Tabelle RATES hinzugefügt werden
  start=GetMicrosecondCount();
  DatabaseTransactionBegin(db);
  int total=ArraySize(rates);
  bool request_error=false;
  for(int i=0i<totali++)
   {
    //--- Festlegen der übrigen Parameter vor dem Hinzufügen des Eintrags die Werte
    ResetLastError();
    if(!DatabaseBind(request1rates[i].time))
     {
      PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d"GetLastError());
      PrintFormat("Balken #%d Zeile=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    //--- wenn der vorherige DatabaseBind()-Aufruf erfolgreich war, wird der nächste Parameter gesetzt
    if(!request_error && !DatabaseBind(request2rates[i].open))
     {
      PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d"GetLastError());
      PrintFormat("Balken #%d Zeile=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request3rates[i].high))
     {
      PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d"GetLastError());
      PrintFormat("Balken #%d Zeile=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request4rates[i].low))
     {
      PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d"GetLastError());
      PrintFormat("Balken #%d Zeile=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request5rates[i].close))
     {
      PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d"GetLastError());
      PrintFormat("Balken #%d Zeile=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request6rates[i].tick_volume))
     {
      PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d"GetLastError());
      PrintFormat("Balken #%d Zeile=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request7rates[i].spread))
     {
      PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d"GetLastError());
      PrintFormat("Balken #%d Zeile=%d"i+1__LINE__);
      request_error=true;
      break;
     }
    if(!request_error && !DatabaseBind(request8rates[i].real_volume))
     {
      PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d"GetLastError());
      PrintFormat("Balken #%d Zeile=%d"i+1__LINE__);
      request_error=true;
      break;
     }
 
    //--- eine Anfrage zum Einfügen des Eintrags ausführen und auf Fehler prüfen
    if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
     {
      PrintFormat("DatabaseRead() fehlgeschlagen, Fehlernummer=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
    //--- die Anfrage vor der nächsten Aktualisierung der Parameter zurücksetzen
    if(!request_error && !DatabaseReset(request))
     {
      PrintFormat("DatabaseReset() fehlgeschlagen, Fehlernummer=%d"GetLastError());
      DatabaseFinalize(request);
      request_error=true;
      break;
     }
   } //--- fertig, alle Balken durchlaufen
 
//--- Transaktionsstatus
  if(request_error)
   {
    PrintFormat("Tabelle RATES: hinzufügen von %d Balken ist fehlgeschlagen"ArraySize(rates));
    DatabaseTransactionRollback(db);
    DatabaseClose(db);
    return;
   }
  else
   {
    DatabaseTransactionCommit(db);
    PrintFormat("Tabelle RATES: %d Balken in %d ms hinzugefügt",
                ArraySize(rates), (GetMicrosecondCount()-start)/1000);
   }
//--- Speichern der Tabelle RATES in einer CSV-Datei
  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("Tabelle RATES gespeichert in "Symbol(), ".csv");
  else
    Print("DatabaseExport() fehlgeschlagen mit Fehlernummer "GetLastError());
//--- Schließen der Datenbankdatei und Informieren darüber
  DatabaseClose(db);
  PrintFormat("Database: %s erstellt und geschlossen"filename);
 }

Siehe auch

DatabasePrint, DatabaseImport