Discussão do artigo "SQL e MQL5: Trabalhando com Banco de Dados SQLite" - página 3

 

Script de teste:

//--- INCLUI 
#include <MQH\Lib\SQLite3\SQLite3Base.mqh>
//--- VARIÁVEIS
CSQLite3Base   sql3;
CSQLite3Table  testTable;
CSQLite3Cell   testCell;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
//--- ABRIR CONEXÃO COM O BANCO DE DADOS
   if(sql3.Connect("test.db3")!=SQLITE_OK)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("CONNECTED TO DB.");
//--- TABELA DE CRIAÇÃO
   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.");
//--- INSERIR VALOR
   if(sql3.Query("INSERT INTO [test] VALUES(1)")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("VALUE \"1\" INSERTED.");
//--- CONTAR AS LINHAS DA TABELA
   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());
   
  }
//+------------------------------------------------------------------+

+adicionado Imprime e testa __int d0 dentro de int ViewInt() para fins de comparação

      Print(__FUNCSIG__," || ENTER FUNCTION");
      
      //--- TESTE 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);

SAÍDA:

//CONECTADO AO BANCO DE DADOS.
//TABELA CRIADA.
//VALOR "1" INSERIDO.
//int CSQLite3Cell::GetInt() || ENTER FUNCTION
//int CSQLite3Cell::GetInt() || type=CT_INT case
//int CByteImg::ViewInt() || ENTER FUNCTION
//TESTE d0: d0.v=0 DADOS d.b:
//0 0 0 0
//ViewArray OUTPUT: d0.v=1 DATA d.b:
//1 0 0 0
// 
//d COMO ERA: d.v=0 DADOS d.b:
//0 0 0 0
//ViewArray OUTPUT: d.v=0 DATA d.b:
//10 0 0
//DADOS RETIRADOS DA TABELA : Count(*)=0

Eu li seu código, @o_o, antes de escrever as postagens anteriores e vi perfeitamente que existe uma união - por isso esse erro também me pareceu estranho, mas é óbvio que ele existe.

No entanto, não encontrei o bug na biblioteca(mais abaixo no código - em ViewArray e construtores __int) . No entanto, posso supor, pelo que está destacado em OUTPUT (obviamente estranho para union), que o compilador "gentil" não viu a alteração em __int após ViewArray (que opera apenas .b) e retornou o último valor conhecido para .v = 0 (destacado) do cache "sem olhar" para o próprio d. v.

Mas aqui tenho apenas suposições, pois não vi o próprio compilador e, repito, não encontrei nenhum erro relacionado a esse bug em seu código.

 
MetaQuotes Software Corp.:

Novo artigo SQL e MQL5: Trabalhando com Banco de Dados SQLite foi publicado:

Autor: o_O


Hey man, great article.

 

Boa tarde,

Recebo 2 avisos ao executar o script:

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' não é uma versão de 64 bits

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]


As bibliotecas 32 e 64 estavam no arquivo. Eu tenho o Win7 64. Não estou entendendo - o que preciso fazer?


 
rvkstudent:
Recebo dois avisos ao executar o script:

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' não é uma versão de 64 bits
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]

As bibliotecas 32 e 64 estavam no arquivo. Eu tenho o Win7 64. Não estou entendendo - o que preciso fazer?

nada

essa é a reação do MT à importação, mas o código continua funcionando.

Há uma correção para a função PrintTable no apêndice.

Arquivos anexados:
sql_ft__mql5.zip  808 kb
 
MetaQuotes Software Corp.:

Novo artigo SQL e MQL5: Working with SQLite Database foi publicado:

Autor: o_O


Você tem uma versão de 32 bits?

O problema é que tenho muitos clientes de 32 bits...

 

Olá.

Quando executo o SQLite3Test.mq5, recebo o erro 14 (SQLITE_CANTOPEN). O que estou fazendo de errado?

 
Serhii Shevchuk:

Olá.

Quando executo o SQLite3Test.mq5, recebo o erro 14 (SQLITE_CANTOPEN).

O que estou fazendo de errado?

não depurando ou registrando o local do erro

 
o_o:

não depurar ou não imprimir o local do erro no registro

1. Executo o script do arquivo, "como está".

2. Depurar "Em dados reais". Eu insiro a primeira função:

//--- abrir conexão com o banco de dados
   if(sql3.Connect("SQLite3Test.db3")!=SQLITE_OK)
      return;

3. Chego a este ponto no arquivo 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. Depois de executar a linha

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

obtenho res igual a 14. Esse é o fim do script.

No entanto, a julgar pelo texto do artigo, deveria ser

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

Qual pode ser o motivo? O que devo procurar?

 

Verifiquei o script baixado


Tudo funcionou corretamente na primeira vez




Serhii Shevchuk:

Em que direção olhar?

comece aqui

 
o_o:

Verificou o script baixado

Eu também o verifiquei:

Ainda é o erro 14.

Sei que é difícil obter ajuda de vocês. Terei que resolver isso sozinho. Lembre-se de que seu exemplo não funciona em todos os lugares. Não sei por quê.