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

 
сама кверя рабочая. Тут или я не с того места достаю результат или сам класс который передает кверю в бд не правильно работает.
 

Я в настоящее время испытываю эту ошибку, может ли кто-нибудь мне помочь?

Файлы:
Immagine.jpg  268 kb
 
d.bignotti:

Я в настоящее время испытываю эту ошибку, может ли кто-нибудь мне помочь?

спасибо за сообщение

исправление в архиве

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Denis Kanapis, 2017.06.11 15:28

 string query="SELECT COUNT(*) FROM '"+table+"' WHERE low<"+lowLevel+" AND high>"+highLevel+" AND date>'"+TimeToString(time)+"'";

if(sql3.Query(tbl,query)!=SQLITE_DONE)

        {

         Print(sql3.ErrorMsg());

         return 0.0;

        }

      sql3.Disconnect();

      CSQLite3Cell cell;

      tbl.Cell(0,0,cell);

      int gg=cell.GetInt64();


gg всегда выдает 0. Хотя если кверю ввести на прямую в БД, то выдает правильное значение.

И если вместо COUNT поставить какую-нибудь колонку и потом посмотреть размер массива ArraySize(tbl.m_data), то все гуд. Т.е. count не работает. Не знаю, может я что-то не так делаю...


То же самое - COUNT выводит 0, но при запуске скрипта из SQLiteStuido - все считает.

Практическим путем установлено что это происходит на таблицах с ~10000>числомСтрок. Более того, если полученную таблицу tbl, как в указанном примере распечатать (встроенной в код функцией) - столбцы типа INTEGER будут выведены 0, хотя они не 0, само собой. Причем в той же распечатке DOUBLE выводит верно.

С интами что-то, похоже (не успел еще проdebgить).

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

BeforeFlight, 2017.08.31 07:55


То же самое - COUNT выводит 0, но при запуске скрипта из SQLiteStuido - все считает.

Практическим путем установлено что это происходит на таблицах с ~10000>числомСтрок. Более того, если полученную таблицу tbl, как в указанном примере распечатать (встроенной в код функцией) - столбцы типа INTEGER будут выведены 0, хотя они не 0, само собой. Причем в той же распечатке DOUBLE выводит верно.

С интами что-то, похоже (не успел еще проdebgить).


Нашел - в файле "Include\MQH\Ctrl\ByteImg.mqh":

вместо:

int ViewInt() { __int d; d.v=0; ViewArray(d.b,0,4); return(d.v); }

очевидно имелось ввиду:

int ViewInt() { __int d={0}; ViewArray(d.b,0,4); return(d.v); }

после этого все верно с COUNT, и распечаткой таблиц. По крайней мере мои тесты проходит.

@o_o @Denis Kanapis

 
BeforeFlight:

Нашел - в файле "Include\MQH\Ctrl\ByteImg.mqh":

вместо:

очевидно имелось ввиду:

после этого все верно с COUNT, и распечаткой таблиц. По крайней мере мои тесты проходит.

@o_o @Denis Kanapis


Как раз хотел про эту ошибку сказать, опередили :). Для значений INT все время отдавалась значение 0.

 

вы описали баг  для СД,  ибо __int - это union

    union __int { int v;  uchar b[4]; };

и разницы между

__int d; d.v=0;

и

__int d={0};

быть не должно

показываемый вами участок кода вообще непонятно как влияет на ваш COUNT

так как фуцнкия ViewInt не записывает, а как раз наоборот - читает число в d.v. И ей пофик на текущее значение d.v.

-----

я добавил в ByteImg предложенную вами правку, чтоб вам было спокойней.


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

 

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

//--- 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.

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

 

Добрый день,

При запуске скрипта получаю 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
Причина обращения: