Discussione sull’articolo "SQL e MQL5: Lavorare con il database SQLite" - pagina 3

 

Script di test:

//--- COMPRENDE 
#include <MQH\Lib\SQLite3\SQLite3Base.mqh>
//--- VARIABILI
CSQLite3Base   sql3;
CSQLite3Table  testTable;
CSQLite3Cell   testCell;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
//--- APRIRE LA CONNESSIONE AL DATABASE
   if(sql3.Connect("test.db3")!=SQLITE_OK)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("CONNECTED TO DB.");
//--- TABELLA CEATE
   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.");
//--- INSERIRE IL VALORE
   if(sql3.Query("INSERT INTO [test] VALUES(1)")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("VALUE \"1\" INSERTED.");
//--- CONTARE LE RIGHE DELLA TABELLA
   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());
   
  }
//+------------------------------------------------------------------+

+aggiunta Stampa e test __int d0 all'interno di int ViewInt() a scopo di confronto

      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+alcune Stampe
      __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:

//COLLEGATO AL DB.
//TABELLA CREATA.
//VALORE "1" INSERITO.
//int CSQLite3Cell::GetInt() ||INVIO FUNZIONE
//int CSQLite3Cell::GetInt() || type=CT_INT case
//int CByteImg::ViewInt() ||INVIO FUNZIONE
//TEST d0: d0.v=0 DATI d.b:
//0 0 0 0
//ViewArray OUTPUT: d0.v=1 DATA d.b:
//1 0 0 0
// 
//d COME ERA: d.v=0 DATI d.b:
//0 0 0 0
//ViewArray OUTPUT: d.v=0 DATA d.b:
//10 0 0
/Dati recuperati da una tabella: Count(*)=0

Ho letto il tuo codice, @o_o, prima di scrivere i post precedenti e ho visto perfettamente che c'è un'unione - ecco perché questo bug è sembrato strano anche a me, ma è ovviamente lì.

Tuttavia, non ho trovato il bug nella lib(più in basso nel codice - in ViewArray e nei costruttori __int) . Tuttavia, posso supporre da ciò che è evidenziato in OUTPUT (ovviamente strano per l'unione) che il compilatore "gentile" non abbia visto il cambiamento in __int dopo ViewArray (che opera solo su .b) e abbia restituito l'ultimo valore noto per .v = 0 (evidenziato) dalla cache "senza guardare" a d. v stesso.

Ma qui ho solo supposizioni, perché non ho visto il compilatore stesso, e ripeto, non ho trovato alcun errore relativo a questo bug nel vostro codice.

 
MetaQuotes Software Corp.:

Pubblicato un nuovo articolo su SQL e MQL5: lavorare con il database SQLite:

Autore: o_O


Ehi amico, ottimo articolo.

 

Buon pomeriggio,

Ricevo 2 avvisi quando eseguo lo script:

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' non è la versione a 64 bit.

2017.09.26 07:39:35.602 SQLite3Test (GAZP,H1) Impossibile caricare 'C:\sers\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' [193]


Entrambe le librerie 32 e 64 erano presenti nell'archivio. Ho Win7 64. Non capisco: cosa devo fare?


 
rvkstudent:
Ricevo 2 avvisi quando eseguo lo script:

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' non è la versione a 64 bit
2017.09.26 07:39:35.602 SQLite3Test (GAZP,H1) Impossibile caricare 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' [193]

Entrambe le librerie 32 e 64 erano presenti nell'archivio. Ho Win7 64. Non capisco: cosa devo fare?

nulla

Questa è la reazione di MT all'importazione, ma il codice continua a funzionare.

Nell'appendice è presente una correzione per la funzione PrintTable.

File:
sql_ft__mql5.zip  808 kb
 
MetaQuotes Software Corp.:

Nuovo articolo SQL e MQL5: Lavorare con il database SQLite è stato pubblicato:

Autore: o_O


Avete una versione a 32 bit?

Il problema è che ho molti clienti a 32 bit...

 

Salve.

Quando eseguo SQLite3Test.mq5 ottengo l'errore 14 (SQLITE_CANTOPEN). Cosa sto sbagliando?

 
Serhii Shevchuk:

Salve.

Quando eseguo SQLite3Test.mq5 ottengo l'errore 14 (SQLITE_CANTOPEN).

Cosa sto sbagliando?

non eseguo il debug o il logging della posizione dell'errore

 
o_o:

non eseguire il debug o non stampare la posizione dell'errore nel registro

1. Eseguo lo script dall'archivio, "così com'è".

2. Eseguire il debug "Su dati reali". Inserisco la prima funzione:

//--- aprire la connessione al database
   if(sql3.Connect("SQLite3Test.db3")!=SQLITE_OK)
      return;

3. Arrivo a questo punto del file 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. Dopo aver eseguito la riga

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

ottengo res pari a 14. Questa è la fine dello script.

Anche se, a giudicare dal testo dell'articolo, dovrebbe essere

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

Quale può essere il motivo? Da che parte guardare?

 

Ho controllato lo script scaricato


Tutto ha funzionato correttamente la prima volta




Serhii Shevchuk:

In che direzione guardare?

inizia qui

 
o_o:

Ho controllato lo script scaricato

L'ho controllato anch'io:

Ancora errore 14.

Mi rendo conto che è difficile ottenere aiuto da voi. Dovrò trovare una soluzione da solo. Tieni presente che il tuo esempio non funziona ovunque. Non so perché.