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パラメーターに設定された値区切り文字を含めることができます。この場合、「flags」パラメーターでDATABASE_EXPORT_QUOTED_STRINGSフラグを使用してください。このフラグが存在する場合、表示されるすべての文字列は二重引用符で囲まれます。文字列に含まれる二重引用符は、2つの二重引用符に置き換えられます。

 

ENUM_DATABASE_EXPORT_FLAGS

ID

説明

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;
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                             |
//+------------------------------------------------------------------+
void OnStart()
{
MqlRates rates[];
//--- バーを受け取る前に開始時間を覚えておく
ulong start=GetMicrosecondCount();
//--- 最後の100バーをリクエストする
if(CopyRates(Symbol(), PERIOD_H1, 1, InpRates, rates)<InpRates)
  {
  Print("CopyRates() failed,, Error ", GetLastError());
  return;
  }
else
  {
  //--- 受信されたバーの数と受信にかかった時間
  PrintFormat("%s: CopyRates received %d bars in %d ms ",
              _Symbol, ArraySize(rates), (GetMicrosecondCount()-start)/1000);
  }
//--- データベースを保存するためのファイル名を設定する
string filename=_Symbol+"_"+EnumToString(PERIOD_H1)+"_"+TimeToString(TimeCurrent())+".sqlite";
StringReplace(filename, ":", "-"); // ":" character is not allowed in file names
//--- 共通の端末フォルダーでデータベースを作成または開く
int db=DatabaseOpen(filename, DATABASE_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)"; // request parameters
int request=DatabasePrepare(db, sql);
if(request==INVALID_HANDLE)
  {
  PrintFormat("DatabasePrepare() failed with code=%d", GetLastError());
  Print("SQL request: ", sql);
  DatabaseClose(db);
  return;
  }
//--- 最初のリクエストパラメータの値を設定する
DatabaseBind(request, 0, _Symbol);
//--- RATESテーブルにバーを追加する前に開始時間を覚えておく
start=GetMicrosecondCount();
DatabaseTransactionBegin(db);
int total=ArraySize(rates);
bool request_error=false;
for(int i=0; i<total; i++)
  {
  //--- エントリを追加する前に残りのパラメータの値を設定する
  ResetLastError();
  if(!DatabaseBind(request, 1, rates[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(request, 2, rates[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(request, 3, rates[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(request, 4, rates[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(request, 5, rates[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(request, 6, rates[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(request, 7, rates[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(request, 8, rates[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_filename, DATABASE_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);

 

参照

DatabasePrintDatabaseImport