文章 "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");
      
      //--- 测试 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+some Prints
      __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);

输出:

//connected to db.
//table created.
//插入的值为 "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 输出: d0.v=1 DATA d.b:
//1 0 0 0
// 
//d AS WAS: d.v=0 DATA d.b:
//0 0 0 0
//ViewArray 输出:d.v=0 DATA d.b:
//10 0 0
//RETRIEVED DATA FROM TABLE : Count(*)=0

在写之前的帖子之前,我读了您的代码,@o_o_o,并且很清楚地看到有一个联合 - 这就是为什么我也觉得这个错误很奇怪,但它显然是存在的。

不过,我在库中(在代码的更下面--在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:\Users\Roman\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。我不明白 - 我需要做什么?


 
rvkstudent:
运行脚本时,我收到了 2 条警告:

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' is not 64-bit version
2017.09.26 07:39:35.602 SQLite3Test (GAZP,H1) 无法加载'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.我在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。

我知道很难从你那里得到帮助。我只能自己想办法了。请记住,您的示例并不是在所有地方都有效。我也不知道为什么。