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
②テーブルから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.mqhとmysql_v2.0.5.mqhは関数名が変更されたりと、仕様が変わっている。
そのため、mysql_v2.0.4.mqhで紹介されているExampleは、v2.0.5では動かない。その他、見えない部分で整合性が取れていないと不具合の可能性もあるので、同一箇所からダウンロードする。
dll化されている部分は実装が分からないので、それが気持ち悪い場合は、自分でDLLを作成した方が良さそう。個人的にはC言語でデータベース接続プログラムを書いたことはないので、勉強にもなる。