Обсуждение статьи "SQL и MQL5: Работаем с базой данных SQLite" - страница 3

 

Тестовый скрипт:

//--- INCLUDES 
#include <MQH\Lib\SQLite3\SQLite3Base.mqh>
//--- VARIABLES
CSQLite3Base   sql3;
CSQLite3Table  testTable;
CSQLite3Cell   testCell;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- OPEN DATABASE CONNECTION
   if(sql3.Connect("test.db3")!=SQLITE_OK)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("CONNECTED TO DB.");
//--- CEATE TABLE
   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.");
//--- INSERT VALUE
   if(sql3.Query("INSERT INTO [test] VALUES(1)")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("VALUE \"1\" INSERTED.");
//--- COUNT TABLE ROWS
   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());
   
  }
//+------------------------------------------------------------------+

+добавил Printов и тестовый __int  d0 внутри int ViewInt()  для сравнения

      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+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);

OUTPUT:

//CONNECTED TO DB.
//TABLE CREATED.
//VALUE "1" INSERTED.
//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 AS WAS: d.v=0 DATA d.b:
//0 0 0 0
//ViewArray OUTPUT: d.v=0 DATA d.b:
//1 0 0 0
//RETRIEVED DATA FROM TABLE : Count(*)=0

Я прочитал Ваш, @o_o код, прежде чем писать предыдущие посты и прекрасно видел что там union - потому мне тоже этот баг показался странным, но он очевидно есть.

Правда в "lib'е" (далее по коду - во ViewArray и конструкторах __int) я ошибки так и не нашел. Однако из выделенного в OUTPUT (очевидно странного для union) могу предположить, что "добрый" компилятор не увидел изменения в __int после ViewArray (который оперирует только .b), и вернул из кэша последнее известное значение для .v = 0 (выделено) "неглядя" в сам d.v.

Но здесь у меня только предположения, потому как самого комплиятора я в глаза не видел, а в Вашем коде, повторюсь, я связанных с этим багом ошибок не нашел.

 
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) Cannot load 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' [193]

В архиве были обе библиотеки 32 и 64. У меня ОС Win7 64. Не понимаю - что требуется сделать?

ничего

это реакция МТ на импорт, но код продолжает работать.

В приложении исправление по функции 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. Дебаг "На реальных данных". Захожу в первую функцию:

//--- open database connection
   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."

Что может быть причиной? В какую сторону смотреть?

 

Проверил скачанный скрипт


всё отработало с первого раза правильно




Serhii Shevchuk:

В какую сторону смотреть?

начните отсюда

 
o_o:

Проверил скачанный скрипт

Я тоже проверил:

Всё так же ошибка 14.

Я понял, что от Вас сложно добиться помощи по делу. Буду разбираться сам. Просто имейте в виду, что Ваш пример работает не везде. Почему - пока не знаю.