記事"SQL と MQL5:SQLite データベースとの連携"についてのディスカッション - ページ 3

 

テストスクリプト:

//--- 含まれるもの 
#include <MQH\Lib\SQLite3\SQLite3Base.mqh>
//--- 変数
CSQLite3Base   sql3;
CSQLite3Table  testTable;
CSQLite3Cell   testCell;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
//--- データベース接続を開く
   if(sql3.Connect("test.db3")!=SQLITE_OK)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("CONNECTED TO DB.");
//--- テーブルを囲む
   if(sql3.Query("DROP TABLE IF EXISTS [test]")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   if(sql3.Query("CREATE TABLE [test] ([i] INT)")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("TABLE CREATED.");
//--- 値を挿入する
   if(sql3.Query("INSERT INTO [test] VALUES(1)")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("VALUE \"1\" INSERTED.");
//--- テーブルの行数を数える
   if(sql3.Query(testTable,"SELECT COUNT(*) FROM [test]")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   testTable.Cell(0,0,testCell);
   Print("RETRIEVED DATA FROM TABLE : Count(*)=",testCell.GetInt());
   
  }
//+------------------------------------------------------------------+

+比較のため、int ViewInt() 内に__int d0の プリントとテストを追加。

      Print(__FUNCSIG__," || ENTER FUNCTION");
      
      //--- TEST d0 
      __int d0={0};  Print ("TEST d0: d0.v=",d0.v, " DATA d.b:"); ArrayPrint(d0.b);
      ViewArray(d0.b,0,4);
      Print("ViewArray OUTPUT: d0.v=",d0.v," DATA d.b:"); ArrayPrint(d0.b);
      
      //--- d - AS WAS+いくつかのプリント
      __int d; d.v=0; Print("\n","d AS WAS: d.v=",d.v," DATA d.b:"); ArrayPrint(d.b);
      ViewArray(d.b,0,4);
      Print("ViewArray OUTPUT: d.v=",d.v, " DATA d.b:"); ArrayPrint (d.b);
      //---
       return(d.v);

出力:

//DBに接続。
//テーブルが作成された。
//値 "1 "が挿入された。
//int CSQLite3Cell::GetInt() || ENTER FUNCTION
//int CSQLite3Cell::GetInt() || type=CT_INT case
//int CByteImg::ViewInt() || ENTER FUNCTION
//TEST d0: d0.v=0 DATA d.b:
//0 0 0 0
//ViewArray OUTPUT: d0.v=1 DATA d.b:
//1 0 0 0
// 
//d.v=0 DATA d.b:
//0 0 0 0
//ViewArray OUTPUT:d.v=0 DATA d.b:
//10 0 0
//RETRIEVED DATA FROM TABLE : Count(*)=0

前の投稿を書く前に、@o_o さんのコードを読み、ユニオンが あることを完全に理解しました。だからこのバグは私にとっても奇妙に思えたのですが、明らかに存在します。

しかし、lib(コードのさらに下、ViewArrayと コンストラクタ __int 。しかし、OUTPUTで ハイライトされている内容から推測すると(unionとしては明らかにおかしい)、「親切な」コンパイラーはViewArray(.bのみを操作する)の後の__intの変更に気づかず、d. v自体を「見ずに」キャッシュから .v = 0(ハイライトされている)の最後の既知の値を返したと 考えられます

しかし、私はコンパイラー自体を見ていないので、ここでは推測に過ぎません。繰り返しますが、あなたのコードにはこのバグに関連するエラーは見当たりません。

 
MetaQuotes Software Corp.:

新しい記事SQLとMQL5: SQLiteデータベースを使う を公開しました:

著者:o_O


やあ、素晴らしい記事だね。

 

こんにちは、

スクリプトを実行すると2つの警告が出ます:

2017.09.26 07:39:35.569 SQLite3Test 'C:∕UsersRoman∕AppData∕Roaming∕MetaQuotes∕Terminal∕MQL5∕Libraries∕sqlite3_32.dll' is not 64-bit version

2017.09.26 07:39:35.602 SQLite3Test (GAZP,H1) Cannot load 'C:◆UsersRoman◇AppData◇Roaming◇MetaQuotes◇Terminal◇MQL5◇Libraries◇sqlite3_32.dll' [193]


ライブラリ32と64の両方がアーカイブに入っていた。Win7 64を持っている。理解できません。どうすればいいですか?


 
rvkstudent:
スクリプトを実行すると2つの警告が出る:

2017.09.26 07:39:35.569 SQLite3Test 'C:∕UsersRoman∕AppData∕Roaming∕MetaQuotes∕Terminal∕MQL5∕Libraries∕sqlite3_32.dll' is not 64-bit version
2017.09.26 07:39:35.602 SQLite3Test (GAZP,H1) Cannot load 'C:♪Users ♪Roman ♪AppData ♪Roaming ♪MetaQuotes ♪Terminal ♪MQL5 ♪Libraries ♪sqlite3_32.dll' [193].

ライブラリ32と64の両方がアーカイブに入っていた。Win7 64を持っている。理解できない - 何をすればいいですか?

何も

これはインポートに対するMTの反応ですが、コードは引き続き動作します。

付録のPrintTable関数の 修正があります。

ファイル:
sql_ft__mql5.zip  808 kb
 
MetaQuotes Software Corp.:

新しい記事SQLとMQL5:SQLiteデータベースの使い方を 掲載しました:

著者:o_O


32ビット版はありますか?

この問題は32ビットの顧客が多いことです。

 

こんにちは。

SQLite3Test.mq5を実行するとエラー14(SQLITE_CANTOPEN)が出ます。何が間違っているのでしょうか?

 
Serhii Shevchuk:

こんにちは。

SQLite3Test.mq5を実行するとエラー14(SQLITE_CANTOPEN)が出ます。

何が間違っている のでしょうか?

エラーの場所をデバッグまたはログしていない。

 
o_o:

デバッグしない、またはエラー箇所をログに出力しない。

1.アーカイブからスクリプトを「そのまま」実行する。

2.実データで」デバッグする。最初の関数を入力します:

//--- データベース接続を開く
   if(sql3.Connect("SQLite3Test.db3")!=SQLITE_OK)
      return;

3.3.SQLite3Base.mqhファイルのこの場所にたどり着く:

int CSQLite3Base::Reconnect()
  {
   Disconnect();
   uchar file[];
   StringToCharArray(m_dbfile,file);
   int res=::sqlite3_open(file,m_db);
   m_bopened=(res==SQLITE_OK && m_db);
   return(res);
  }

4.この行を実行すると

int res=::sqlite3_open(file,m_db);

resは14に等しい。これでスクリプトは終わりである。

記事の文面から判断すると、このようになるはずですが。

"В результате работы появится файл базы данных в папке установки терминала MetaTrader 5."

理由は何だろう?どちらを見ればいいのでしょうか?

 

ダウンロードしたスクリプトをチェック


初回はすべて正常に動作しました。




セルヒイ・シェフチュク

どの方向を見ますか?

ここから

 
o_o:

ダウンロードしたスクリプトをチェック

私もチェックした:

まだエラー14です。

あなたの助けを借りるのは難しいとわかっています。自分で解決するしかない。ただ、あなたの例はどこでも機能するわけではないことを覚えておいてほしい。なぜかは分からない。