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

 

В связи с изменениями в копировании struct - поправлен файл ByteImg.mqh на использование union

новый FastFile скачайте в его публикации https://www.mql5.com/ru/forum/6291#comment_4967832
Файлы:
ByteImg.mqh  6 kb
 
 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 не работает. Не знаю, может я что-то не так делаю...

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

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

Файлы:
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 предложенную вами правку, чтоб вам было спокойней.


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