Diskussion zum Artikel "SQL und MQL5: Mit der SQLite Datenbank arbeiten" - Seite 3

 

Test-Skript:

//--- BEINHALTET 
#include <MQH\Lib\SQLite3\SQLite3Base.mqh>
//--- VARIABLEN
CSQLite3Base   sql3;
CSQLite3Table  testTable;
CSQLite3Cell   testCell;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
//--- DATENBANKVERBINDUNG ÖFFNEN
   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.");
//--- WERT EINFÜGEN
   if(sql3.Query("INSERT INTO [test] VALUES(1)")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("VALUE \"1\" INSERTED.");
//--- TABELLENZEILEN ZÄHLEN
   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());
   
  }
//+------------------------------------------------------------------+

+Druckt und testet __int d0 innerhalb von int ViewInt() zu Vergleichszwecken

      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:

//VERBUNDEN MIT DB.
//TABELLE ERSTELLT.
//WERT "1" EINGEFÜGT.
//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:
//10 0 0
/RETRIEVED DATA FROM TABLE : Count(*)=0

Ich habe deinen Code gelesen, @o_o, bevor ich die vorherigen Beiträge geschrieben habe, und habe sehr wohl gesehen, dass es eine Union gibt - deshalb kam mir dieser Fehler auch seltsam vor, aber er ist offensichtlich vorhanden.

Allerdings habe ich den Fehler nicht in der Lib gefunden (weiter unten im Code - in ViewArray und Konstruktoren __int) . Allerdings kann ich aus dem, was in OUTPUT hervorgehoben ist (offensichtlich seltsam für union), annehmen, dass der "freundliche" Compiler die Änderung in __int nach ViewArray (das nur .b bedient) nicht gesehen hat und den letzten bekannten Wert für .v = 0 (hervorgehoben) aus dem Cache zurückgegeben hat, "ohne sich d. v selbst anzusehen".

Aber hier habe ich nur Vermutungen, weil ich den Compiler selbst nicht gesehen habe, und ich wiederhole, ich habe keine Fehler im Zusammenhang mit diesem Fehler in Ihrem Code gefunden.

 
MetaQuotes Software Corp.:

Neuer Artikel SQL und MQL5: Arbeiten mit SQLite Datenbank wurde veröffentlicht:

Autor: o_O


Hey Mann, toller Artikel.

 

Guten Tag!

Ich erhalte 2 Warnungen, wenn ich das Skript ausführe:

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' ist keine 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]


Beide Bibliotheken 32 und 64 waren im Archiv. Ich habe Win7 64. Ich verstehe das nicht - was muss ich tun?


 
rvkstudent:
Ich erhalte 2 Warnungen, wenn ich das Skript ausführe:

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' ist keine 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]

Beide Bibliotheken 32 und 64 waren im Archiv. Ich habe Win7 64. Ich verstehe das nicht - was muss ich tun?

nichts

Das ist die Reaktion von MT auf den Import, aber der Code funktioniert weiterhin.

Es gibt einen Fix für die PrintTable-Funktion im Anhang.

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

Neuer Artikel SQL und MQL5: Arbeiten mit der SQLite Datenbank wurde veröffentlicht:

Autor: o_O


Haben Sie eine 32-Bit-Version?

Das Problem ist, dass ich viele 32-Bit-Kunden habe...

 

Hallo.

Wenn ich SQLite3Test.mq5 ausführe, erhalte ich Fehler 14 (SQLITE_CANTOPEN). Was mache ich falsch?

 
Serhii Shevchuk:

Hallo.

Wenn ich SQLite3Test.mq5 ausführe, erhalte ich Fehler 14 (SQLITE_CANTOPEN).

Was mache ich falsch?

kein Debugging oder Protokollierung der Fehlerstelle

 
o_o:

keine Fehlersuche durchführen oder den Fehlerort nicht in das Protokoll drucken

1. Ich führe das Skript aus dem Archiv aus, "wie es ist".

2. Debuggen "Bei echten Daten". Ich gebe die erste Funktion ein:

//--- Datenbankverbindung öffnen
   if(sql3.Connect("SQLite3Test.db3")!=SQLITE_OK)
      return;

3. Ich komme zu dieser Stelle in der Datei 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. Nach dem Ausführen der Zeile

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

erhalte ich res gleich 14. Dies ist das Ende des Skripts.

Nach dem Text des Artikels zu urteilen, sollte es aber so sein

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

Was kann der Grund dafür sein? Wo muss ich suchen?

 

Ich habe das heruntergeladene Skript überprüft


Beim ersten Mal hat alles korrekt funktioniert




Serhii Shevchuk:

In welche Richtung soll ich schauen?

hier anfangen

 
o_o:

Überprüft das heruntergeladene Skript

Ich habe es auch überprüft:

Immer noch Fehler 14.

Ich weiß, dass es schwierig ist, von Ihnen Hilfe zu bekommen. Ich werde es einfach selbst herausfinden müssen. Bedenken Sie nur, dass Ihr Beispiel nicht überall funktioniert. Ich weiß nicht, warum.