libmysql.dllだけで対処することは諦めてMySQL wrapperを使用してみる

libmysql.dllだけでは、selectの結果をMetatrader4で扱えない?」で、libmysql.dllだけを使用してMySQLからselectするMT4プログラムを動かそうとしたが自力ではできずに諦め、MySQL wrapperを使用することにした。
以下、その時のメモ。

0.資源を「MQL4 - automated forex trading Code Base」からダウンロードする。-ダウンロードしたら、全て解凍する。
1.\experts\includeにmysql_v2.0.5.mqhを配置する-mysqlMT4Solution.zipを解凍すると、expertsフォルダができるので、其の中の\experts\include\mysql_v2.0.5.mqhを\experts\includeにコピーする。

2.\\experts\librariesにmysql_wrapper.dllを配置する-mysqlMT4Solution.zipを解凍すると、expertsフォルダができるので、其の中の\Debug\mysql_wrapper.dllを\experts\librariesにコピーする。

3.\\experts\librariesにlibmysql.dllを配置する-2で展開したフォルダと同じ場所のlibmySQL.dllを\experts\librariesにコピーする。

これで、準備は終了。
あとはサンプルプログラムを書いて試すだけ。

①予めMySQLにデータを用意しておく。
ここでは次のように用意した。

DB名:test
テーブル名:metatrade

データは下図のように3行用意した。

②テーブルからselectするプログラムを書く
サンプルを元にテストプログラムを書く。

#property indicator_chart_window
#include <mysql_v2.0.5.mqh>
#import "libmySQL.dll"
#import "mysql_wrapper.dll"

string  host     = "ホスト名";
string  user     = "ユーザ名";
string  pass     = "パスワード";
string  dbName   = "test";
int     port     = 3306;
int     socket   = 0;
int     client   = 0;

int     dbConnectId = 0;
bool    goodConnect = false;

int init(){
   goodConnect = mysqlInit(dbConnectId, host, user, pass, dbName, port, socket, client);
   if ( !goodConnect ) {
       return (1); // bad connect
   }
   executeQuery();
   return(0);
}

int deinit(){
   mysqlDeinit(dbConnectId);
   return(0);
}

int start(){
   return(0);
}

void executeQuery(){ 
   string data[][2];
   string lsQuery = "select * from metatrade";
   int result = mysqlFetchArray(dbConnectId, lsQuery, data);
   if ( result == 0 ) {
        Print("0 rows selected");
   } else if ( result == -1 ) {
        Print("some error occured");
   }
   
   int rows = ArrayRange(data, 0);
   int cols = ArrayRange(data, 1);
   for (int i = 0; i < rows; i++){
      for (int j = 0; j < cols; j++){
         Print(data[i][j]);
      }
   }
}

実行すると結果が取得できている。

これで終わり。

最後に、混乱したことを纏めておく。
・ライブラリ、インクルードファイルは同一ダウンロード元から取得すること。
mysql_v2.0.4.mqhmysql_v2.0.5.mqhは関数名が変更されたりと、仕様が変わっている。
そのため、mysql_v2.0.4.mqhで紹介されているExampleは、v2.0.5では動かない。その他、見えない部分で整合性が取れていないと不具合の可能性もあるので、同一箇所からダウンロードする。

dll化されている部分は実装が分からないので、それが気持ち悪い場合は、自分でDLLを作成した方が良さそう。個人的にはC言語でデータベース接続プログラムを書いたことはないので、勉強にもなる。