Discusión sobre el artículo "SQL y MQL5: Trabajando con la base de datos SQLite" - página 3

 

Script de prueba:

//--- INCLUYE 
#include <MQH\Lib\SQLite3\SQLite3Base.mqh>
//--- VARIABLES
CSQLite3Base   sql3;
CSQLite3Table  testTable;
CSQLite3Cell   testCell;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
//--- ABRIR CONEXIÓN A BASE DE DATOS
   if(sql3.Connect("test.db3")!=SQLITE_OK)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("CONNECTED TO DB.");
//--- TABLA 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.");
//--- INSERTAR VALOR
   if(sql3.Query("INSERT INTO [test] VALUES(1)")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("VALUE \"1\" INSERTED.");
//--- CONTAR FILAS DE LA TABLA
   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());
   
  }
//+------------------------------------------------------------------+

+añadido Imprime y prueba __int d0 dentro de int ViewInt() por motivos de comparación.

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

SALIDA:

//CONECTADO A DB.
//TABLA CREADA.
//VALOR "1" INSERTADO.
//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 COMO ERA: d.v=0 DATOS d.b:
//0 0 0 0
//ViewArray SALIDA: d.v=0 DATA d.b:
//10 0 0
//RECOGIDA DE DATOS DE LA TABLA : Count(*)=0

Leí tu código, @o_o, antes de escribir los posts anteriores y vi perfectamente que hay una unión - por eso este bug también me pareció extraño, pero obviamente está ahí.

Sin embargo, no encontré el bug en la lib(más abajo en el código - en ViewArray y constructores __int) . Sin embargo, puedo suponer por lo que está resaltado en OUTPUT (obviamente extraño para la unión) que el compilador "amable" no vio el cambio en __int después de ViewArray (que opera sólo .b) y devolvió el último valor conocido para .v = 0 (resaltado) de la caché "sin mirar" el propio d. v.

Pero aquí sólo tengo suposiciones, porque no he visto el compilador en sí, y repito, no he encontrado ningún error relacionado con este fallo en su código.

 
MetaQuotes Software Corp.:

Nuevo artículo SQL y MQL5: Trabajando con Base de Datos SQLite ha sido publicado:

Autor: o_O


Hola tío, muy buen artículo.

 

Buenas tardes,

Recibo 2 advertencias al ejecutar el script:

2017.09.26 07:39:35.569 SQL ite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' no es la versión de 64 bits

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


Ambas bibliotecas 32 y 64 estaban en el archivo. Tengo Win7 64. No entiendo - ¿qué tengo que hacer?


 
rvkstudent:
Recibo 2 advertencias al ejecutar el script:

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' no es la versión de 64 bits
2017.09.26 07:39:35.602 SQLite3Test (GAZP,H1) No se puede cargar 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' [193]

Ambas bibliotecas 32 y 64 estaban en el archivo. Tengo Win7 64. No entiendo - ¿qué tengo que hacer?

nada

esta es la reacción de MT a la importación, pero el código sigue funcionando.

Hay una solución para la función PrintTable en el apéndice.

Archivos adjuntos:
sql_ft__mql5.zip  808 kb
 
MetaQuotes Software Corp.:

Nuevo artículo SQL y MQL5: Trabajando con Base de Datos SQLite ha sido publicado:

Autor: o_O


¿Tenéis una versión para 32 bits?

El problema es que tengo muchos clientes de 32 bits...

 

Hola.

Cuando ejecuto SQLite3Test.mq5 obtengo el error 14 (SQLITE_CANTOPEN). ¿Qué estoy haciendo mal?

 
Serhii Shevchuk:

Hola.

Cuando ejecuto SQLite3Test.mq5 obtengo el error 14 (SQLITE_CANTOPEN).

¿Qué estoy haciendo mal?

no depurar o registrar la ubicación del error

 
o_o:

no depurar o no imprimir la localización del error en el log

1. Ejecuto el script desde el archivo, "tal cual".

2. Depuro "Sobre datos reales". Introduzco la primera función:

//--- abrir conexión a base de datos
   if(sql3.Connect("SQLite3Test.db3")!=SQLITE_OK)
      return;

3. Llego a este lugar en el archivo 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. Después de ejecutar la línea

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

obtengo res igual a 14. Este es el final del script.

Aunque, a juzgar por el texto del artículo, debería ser

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

¿Cuál puede ser la razón? ¿Por dónde mirar?

 

Comprobado el script descargado


Todo funcionó correctamente la primera vez




Serhii Shevchuk:

¿En qué dirección mirar?

empezar aquí

 
o_o:

Comprobado el script descargado

Yo también lo he comprobado:

Sigue dando error 14.

Me doy cuenta de que es difícil que me ayudéis. Tendré que resolverlo yo mismo. Sólo ten en cuenta que tu ejemplo no funciona en todas partes. No sé por qué.