Discussion de l'article "SQL et MQL5 : Travailler avec la base de données SQLite" - page 3

 

Script de test :

//--- INCLUT 
#include <MQH\Lib\SQLite3\SQLite3Base.mqh>
//--- VARIABLES
CSQLite3Base   sql3;
CSQLite3Table  testTable;
CSQLite3Cell   testCell;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
//--- OUVRIR LA CONNEXION À LA BASE DE DONNÉES
   if(sql3.Connect("test.db3")!=SQLITE_OK)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("CONNECTED TO DB.");
//--- TABLEAU DES DATES
   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.");
//--- INSÉRER UNE VALEUR
   if(sql3.Query("INSERT INTO [test] VALUES(1)")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("VALUE \"1\" INSERTED.");
//--- COMPTER LES LIGNES DU TABLEAU
   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());
   
  }
//+------------------------------------------------------------------+

+ajouté Impressions et test __int d0 dans int ViewInt() à des fins de comparaison

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

SORTIE :

//CONNECTÉ À LA BASE DE DONNÉES.
//TABLE CRÉÉE.
//VALEUR "1" INSÉRÉE.
//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
//Voir le tableau OUTPUT : d0.v=1 DATA d.b :
//1 0 0 0
// 
//d AS WAS : d.v=0 DATA d.b :
//0 0 0 0
//Voir le tableau OUTPUT : d.v=0 DATA d.b:
//10 0 0
//Données extraites de la table : Count(*)=0

J'ai lu votre code, @o_o, avant d'écrire les posts précédents et j'ai parfaitement vu qu'il y avait une union - c'est pourquoi ce bug m'a semblé étrange aussi, mais il est manifestement là.

Cependant, je n'ai pas trouvé le bogue dans la librairie(plus bas dans le code - dans ViewArray et les constructeurs __int) . Cependant, je peux supposer d'après ce qui est mis en évidence dans OUTPUT (évidemment étrange pour union) que le compilateur "gentil" n'a pas vu le changement dans __int après ViewArray (qui opère seulement .b) et a retourné la dernière valeur connue pour .v = 0 (mis en évidence) à partir du cache "sans regarder" d. v lui-même.

Mais ici, je n'ai que des suppositions, car je n'ai pas vu le compilateur lui-même, et je répète, je n'ai pas trouvé d'erreurs liées à ce bogue dans votre code.

 
MetaQuotes Software Corp.:

Un nouvel article SQL et MQL5 : Travailler avec la base de données SQLite a été publié :

Auteur : o_O


Hey mec, super article.

 

Bonjour,

J'obtiens 2 avertissements lors de l'exécution du script :

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' n'est pas une version 64-bit

2017.09.26 07:39:35.602 SQLite3Test (GAZP,H1) Impossible de charger 'C:Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' [193].


Les deux bibliothèques 32 et 64 étaient dans l'archive. J'ai Win7 64. Je ne comprends pas - que dois-je faire ?


 
rvkstudent:
J'obtiens 2 avertissements lors de l'exécution du script :

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' n'est pas une version 64-bit
2017.09.26 07:39:35.602 SQLite3Test (GAZP,H1) Impossible de charger 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' [193].

Les deux bibliothèques 32 et 64 étaient dans l'archive. J'ai Win7 64. Je ne comprends pas - que dois-je faire ?

rien

c'est la réaction de MT à l'importation, mais le code continue de fonctionner.

Il y a un correctif pour la fonction PrintTable dans l'annexe.

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

Nouvel article SQL et MQL5 : Travailler avec une base de données SQLite a été publié :

Auteur : o_O


Avez-vous une version 32 bits ?

Le problème est que j'ai beaucoup de clients 32 bits...

 

Bonjour.

Lorsque je lance SQLite3Test.mq5, j'obtiens l'erreur 14 (SQLITE_CANTOPEN). Qu'est-ce qui ne va pas ?

 
Serhii Shevchuk:

Bonjour.

Lorsque je lance SQLite3Test.mq5, j'obtiens l'erreur 14 (SQLITE_CANTOPEN).

Qu'est-ce qui ne va pas ?

Je ne débogue pas et je n'enregistre pas l'emplacement de l'erreur.

 
o_o:

ne pas déboguer ou ne pas imprimer l'emplacement de l'erreur dans le journal

1. J'exécute le script à partir de l'archive, "tel quel".

2. Je débogue "Sur données réelles". J'entre dans la première fonction :

//--- ouvrir la connexion à la base de données
   if(sql3.Connect("SQLite3Test.db3")!=SQLITE_OK)
      return;

3. J'arrive à cet endroit du fichier 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. Après avoir exécuté la ligne

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

j'obtiens res égal à 14. C'est la fin du script.

Pourtant, à en juger par le texte de l'article, ce devrait être le cas.

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

Quelle peut être la raison ? Quel est le chemin à suivre ?

 

Vérification du script téléchargé


Tout a fonctionné correctement la première fois




Serhii Shevchuk:

Dans quelle direction regarder ?

commencer ici

 
o_o:

Vérification du script téléchargé

Je l'ai également vérifié :

Toujours l'erreur 14.

Je sais qu'il est difficile d'obtenir de l'aide de votre part. Je vais devoir me débrouiller tout seul. N'oubliez pas que votre exemple ne fonctionne pas partout. Je ne sais pas pourquoi.