Discusión sobre el artículo "Trabajo con el SGBD MySQL desde MQL5 (MQL4)" - página 7

 

Ok, veo que ha escrito un asesor experto para estos fines, y está escrito sin recomendaciones que he publicado en el artículo.

Por lo tanto, vamos a ir paso a paso: 1. La llamada de " DB = cMySqlConnect

1. La llamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " debe hacerse dentro de OnInit() en lugar de OnTick(). 2. Está utilizando cMySqlConnect.

2. Estás usando cMySqlConnect - es una función importada de la DLL, tienes que usar la función MySqlConnect en lugar de ¡ cMySqlConnect !

3. Debe llamar a la función MySqlDisconnect dentro de la función estándar OnDeinit().

4. Debe verificar el identificador de conexión a la base de datos dentro de la función estándar OnTick() para asegurarse que la conexión fue exitosa.

Finalmente se verá como.

... your code
int DB = -1; // identificador de la base de datos//--
... your code
int OnInit()
{
   DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); 

   if (DB != -1)
    {
    // ¡La conexión ha tenido éxito!
    // aquí tienes que definir la lógica de creación de la tabla
   }
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
 {
 MySqlDisconnect(DB);
 }

void OnTick()
{
 // primer comando.
 if (DB==-1) return; // no realizar ninguna acción cuando no hay conexión

 // aquí su código sin llamada a cMySqlConnect
}
You have to rebuild your code based on the requirements of project, as I see the currently there is no clear logic, everything messed up.
 
elugovoy:

Ok, veo que ha escrito un asesor experto para estos fines, y está escrito sin recomendaciones que he publicado en el artículo.

Por lo tanto, vamos a ir paso a paso: 1. La llamada de " DB = cMySqlConnect

1. La llamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " debe hacerse dentro de OnInit() en lugar de OnTick(). 2. Está utilizando cMySqlConnect.

2. Estás usando cMySqlConnect - es una función importada de la DLL, tienes que usar la función MySqlConnect en lugar de ¡ cMySqlConnect !

3. Debe llamar a la función MySqlDisconnect dentro de la función estándar OnDeinit().

4. Debe verificar el identificador de conexión a la base de datos dentro de la función estándar OnTick() para asegurarse que la conexión fue exitosa.

Finalmente se verá así.

Gracias, lo intentaré de nuevo y daré el resultado.
 
elugovoy:

Ok, veo que ha escrito un asesor experto para estos fines, y está escrito sin recomendaciones que he publicado en el artículo.

Por lo tanto, vamos a ir paso a paso: 1. La llamada de " DB = cMySqlConnect

1. La llamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " debe hacerse dentro de OnInit() en lugar de OnTick(). 2. Está utilizando cMySqlConnect.

2. Estás usando cMySqlConnect - es una función importada de la DLL, tienes que usar la función MySqlConnect en lugar de ¡ cMySqlConnect !

3. Debe llamar a la función MySqlDisconnect dentro de la función estándar OnDeinit().

4. Debe verificar el identificador de conexión a la base de datos dentro de la función estándar OnTick() para asegurarse que la conexión fue exitosa.

Finalmente se verá así.

He cambiado paso a paso, pero el problema sigue existiendo cuando se utiliza el experto en un mt4 para cuatro o mas simbolos. se imprime " Access violation read to 0x0000000B en '... .MQLMySQL.dll'
"

el código es el siguiente

<--


#include <MQLMySQL.mqh

int MySqlErrorNumber; // número de error reciente de MySQL

string MySqlErrorDescription; // descripción del error


//+------------------------------------------------------------------+

//| Función de inicialización experta & nbsp; |

//+------------------------------------------------------------------+

int OnInit()

OnInit(); int OnInit()

EventSetTimer(tiempoSegundos);

DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if( DB == -1 )

if( DB == -1 )

{

Print("La base de datos no está conectada ..."); if( DB == -1 ) { print("La base de datos no está conectada ... "); }

}

return(INIT_SUCCEEDED); }

}

//+------------------------------------------------------------------+

//| Función experta de desinicialización |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

MySqlDisconnect(DB);

EventKillTimer();

ObjectsDeleteAll();

}


void OnTimer()

{

//Alert(TimeCurrent());

OnTick();

}


//+------------------------------------------------------------------+

//| Función tick experta & nbsp; |

//+------------------------------------------------------------------+

void OnTick()

{

if( DB == -1 )

{

Alert("La base de datos no está conectada ... "); return; { Alert("La base de datos no está conectada ...")

return; }

}

¡if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 && DB ! = -1 )

{

int cuenta = AccountNumber();

¡string símbolo = Símbolo(); if( cmd !

¡if( cmd ! ¡= "" && cmd ! = NULL )

{

símbolo = cmd; }

}

symbolOrder = symbol + "_table";

double spread = (Ask - Bid); } symbolOrder = symbol + "_table"; }

admisión = spread*MathPow(10, Dígitos).

//int DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);

Query = "SELECT * FROM " + símbolo + " where NúmeroDeCuenta = " + (cadena)NúmeroDeCuenta();

//Imprimir(Consulta);

int Cursor1 = MySqlCursorOpen(DB, Query);

if (Cursor1 >= 0)

{

int Filas1 = MySqlCursorFilas(Cursor1); int Cursor1 = MySqlCursorOpen(BD, Consulta); if (Cursor1 >= 0)

int dataRows1 = Rows1;

//Alert(dataRows);

if( dataRows1 > 0 )

{

Query = "update " + symbol + " set Oferta = " + (cadena)Oferta + ", Demanda = " + ( cadena)Ask

+ ", Spread = " + DoubleToStr(spread, Digits)

+ ", Hora = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS ) + "' where NúmeroDeCuenta = "

+ (cadena)cuenta; // + "' y Símbolo = '" + símbolo + "'".

MySqlExecute(DB, Consulta);

MySqlCursorClose(Cursor1);

}

else if( dataRows1 == 0 )

{

Query = "CREATE TABLE IF NOT EXISTS " + symbol + " (id int NOT NULL AUTO_ INCREMENT PRIMARY KEY, AccountNumber int, "

+ "Symbol char(20), Bid double, Ask double, Spread double,"

+ "Memo char(50), "

+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET=utf8 ";

MySqlExecute(DB, Consulta);

Query = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread. Memo, Time) VALUES ("

+ (cadena)cuenta + ", '" + símbolo + "', "+(cadena)Oferta+", "+ (cadena)Demanda + ", "

+ DoubleToStr(spread, Dígitos)

+ ", '" + (cadena)CuentaEmpresa()

+ "', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')"";

¡if(MySqlExecute(DB, Query) ! = true )

{

//Query = "DROP TABLE IF EXISTS `tabla_datos`";

//MySqlExecute(DB, Query);

Query = "CREATE TABLE IF NOT EXISTS " + symbol + "(id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "

+ "Symbol char(20), Bid double, Ask double, Spread doble," + "Memo char(50)

+ "Memo char(50), "

+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET= utf8 ";

MySqlExecute(DB, Consulta);

}

}

¡¡¡¡MySqlCursorClose(Cursor1); // NUNCA OLVIDE CERRAR CURSOR !!!!

}

}

}

-->

 
elugovoy:

Ok, veo que ha escrito un asesor experto para estos fines, y está escrito sin recomendaciones que he publicado en el artículo.

Por lo tanto, vamos a ir paso a paso: 1. La llamada de " DB = cMySqlConnect

1. La llamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " debe hacerse dentro de OnInit() en lugar de OnTick(). 2. Está utilizando cMySqlConnect.

2. Estás usando cMySqlConnect - es una función importada de la DLL, tienes que usar la función MySqlConnect en lugar de ¡ cMySqlConnect !

3. Debe llamar a la función MySqlDisconnect dentro de la función estándar OnDeinit().

4. Debe verificar el identificador de conexión a la base de datos dentro de la función estándar OnTick() para asegurarse que la conexión fue exitosa.

Finalmente se verá así.

El problema es que no se puede usar en un mt4 para mas de dos simbolos, si se usa en un solo simbolo, es normal. Cuando se usa en cuatro o mas, funciona bien, pero despues de unos minutos, imprime el problema "OnTick()". minutos, imprime el problema "Access violation read to 0x0000000B in '...MQLMySQL.db'". .MQLMySQL.dll'"

Los exambles son todos los scripts, se ejecuta sólo una vez, Usted puede tratar de uno de los expertos llamar a la dll en cuatro o más símbolos en uno o dos mt4, Usted puede encontrar el problema.

¿Será que la dll necesita un memeoy release o garbe collection?

 
MFC vuelca las fuga s prematuramente al salir, en lugar de esperar a que
CRT vuelque las fugas tras la destrucc ión estática de los datos, y esto provoca &#959; informes de fugas espurios para objetos que asignaron memoria antes de que se inicializara MFC y que, por tanto, se destruyen tras la salida de MFC. nbsp;
informes de fugas espurias para objetos que asignaron memoria antes de que se inicializara el MFC
y que, por tanto, se destruyen después de la salida del MFC. Esto se observa con frecuencia en
cuando se utiliza la DLL de MFC en un programa que también utiliza
la DLL de tiempo de ejecución de C++.
 

Hola de nuevo.

Basado en el código que ha proporcionado supongo que eres nuevo en MQL.

Lo siento, no tengo tiempo para enseñarte, pero tengo tiempo para probar el software que he desarrollado.

Lo siento, no tengo tiempo para enseñarle, pero tengo tiempo para probar el software que he desarrollado. Por lo tanto, aquí están los registros adjuntos.

Han construir pruebas de EA para usted, basado en su lógica: cada tabla definida para cada par de divisas y puede mantener los datos de mercado en línea para diferentes cuentas.

Usted puede inspeccionar los registros, ningún error "Violación de acceso ..." se planteó. Usted puede inspeccionar los registros, ningún error "Violación de acceso ..." se planteó.

El problema no está en la biblioteca MQLMySQL.

Probando EA.

//+------------------------------------------------------------------+
//|& nbsp; &nbsp DFTest.mq4
//|& Copyright 2014, MetaQuotes Software Corp.
//|& nbsp; &nbsp ; http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#include <MQLMySQL.mqh>

input string Host = "localhost";
input string User = "root";
input string Password = "ioctrl";
input string Database = "mysql";
input int Port = 3306;
input string Socket = "";
input int ClientFlag = 0;

input int Timer = 1; // Temporizador (segundos) no utilizado ahora

int DB;

int OnInit()
{
 SQLTrace = true; // para ver todas las consultas que se enviarán a la base de datos
       EventSetTimer(Timer);
       DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); 
       if( DB == -1 )
       {
            Print("Database is not connected! Error: ", MySqlErrorDescription);
            return (INIT_FAILED);
       }
       
 // crear tabla si no existe
 string cmd;
 cmd = "CREATE TABLE IF NOT EXISTS `" + Symbol() + "` (id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "
       + "Symbol char(20), Bid double, Ask double, Spread double, " 
       + "Memo char(50), " 
       + "Time datetime) ENGINE=MEMORY DEFAULT CHARSET=utf8";
 if (!MySqlExecute(DB, cmd))
    {
     Print ("Table creation error: ",MySqlErrorDescription);
     return (INIT_FAILED);
    }
                      

       return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
      MySqlDisconnect(DB); 
      EventKillTimer();
}


void OnTimer()
{
 // nunca se debe llamar a OnTick desde OnTimer y viceversa.
 // el objetivo de estas 2 funciones es diferente
}

void OnTick()
{
 int account;
 string symbol;
 double spread;
 string Query, cmd;
 int Cursor;
 int Rows;
 
 if (DB == -1)
    {
    Comment("Database is not connected ... ");
    return;
    }

 if ( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 )
    {
     account = AccountNumber();
     symbol = "`"+Symbol()+"`"; // si tienes que usarlo como nombre de tabla tienes que usar comillas como buena práctica para base de datos MySQL
     
 
 spread = (Ask - Bid);
 
 // posiblemente sería mejor utilizar algo como esto: admission = MarketInfo(symbol, MODE_SPREAD);
 Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)account;
 Cursor = MySqlCursorOpen(DB, Query);
 if (Cursor >= 0)
    {
      Rows = MySqlCursorRows(Cursor);
      if ( Rows > 0 )
         {
          cmd = "update " + symbol + " set Bid = "+(string)Bid + ", Ask = " + (string)Ask
                       + ", Spread = " + DoubleToStr(spread, Digits)  
                       + ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS) +"' where AccountNumber = " + (string)account;
         }
      else
         {
          cmd = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread, Memo, Time) VALUES (" 
                + (string)account + ", \'" + symbol + "\', "+DoubleToStr(Bid,Digits)+","+ DoubleToStr(Ask,Digits) + ","  + DoubleToStr(spread, Digits) 
                + ", \'" + AccountCompany() +"\', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')";
         }
      if (!MySqlExecute(DB, cmd))
         {
          Print("Updating error: ",MySqlErrorDescription);
          Print (cmd);
         }

      MySqlCursorClose(Cursor);
     }
  }

} 

 

Esta es la lógica correcta de usar la librería.

Debido a la optimización usted puede incluso no usar la sentencia SELECT, solo ejecutar la sentencia UPDATE, entonces verifique si (MySqlRowsAffected()==0) significa que ninguna fila fue afectada. Tiene ~100% de actualizaciones, así que aplique la sentencia INSERT.

Usted tiene ~100% de las actualizaciones, por lo que esta solución puede aumentar el rendimiento y reducir el tráfico de red.

Y al final, los códigos fuente completos del proyecto (incluyendo el desarrollo de DLL) se ha adjuntado al artículo, usted puede cambiar a su manera.

Si usted llena que el problema en MqlMySQL.DLL de todos modos, se puede depurar y arreglar por ti mismo.

Saludos cordiales, Eugene

Eugene

Archivos adjuntos:
logs.zip  302 kb
 

Gran trabajo, muchas gracias Eugeniy.

Sus códigos me ayudan mucho, puedo ahorrar mucho tiempo. He intentado hacer INSERT, SELECT, UPDATE y DELETE consulta con éxito. Si no me equivoco, el "Cursor" es necesario sólo para la consulta SELECT?

= pedma

//+------------------------------------------------------------------+
//|MySQL-006.mq4
//|Copyright 2014, Eugene Lugovoy |
//| http://www.fxcodexlab.com ||
//| Consulta Seleccionar, Insertar, Actualizar y Eliminar|
//| modificado por : pedma|
//+------------------------------------------------------------------+

#property copyright "Copyright 2014, Eugene Lugovoy."
#property link      "http://www.fxcodexlab.com"
#property version   "1.00"
#property strict

#include <MQLMySQL.mqh>

string INI;
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart() {
 string Host, User, Password, Database, Socket; // credenciales de la base de datos
 int Port,ClientFlag;
 int DB; // identificador de la base de datos
 
 Print (MySqlVersion());

 INI = "C:\\This\\Must\\be\\Real\\Path\\To\\MyConnection.ini";
 
 // lectura de las credenciales de la base de datos desde el archivo INI
 Host = ReadIni(INI, "MYSQL", "Host");
 User = ReadIni(INI, "MYSQL", "User");
 Password = ReadIni(INI, "MYSQL", "Password");
 Database = ReadIni(INI, "MYSQL", "Database");
 Port     = StrToInteger(ReadIni(INI, "MYSQL", "Port"));
 Socket   = ReadIni(INI, "MYSQL", "Socket");
 /// ClientFlag = StrToInteger(ReadIni(INI, "MYSQL", "ClientFlag")); 
 ClientFlag = CLIENT_MULTI_STATEMENTS;

 Print ("Host: ",Host, ", User: ", User, ", Database: ",Database);
 
 // abrir la conexión a la base de datos
 Print ("Connecting...");
 
 DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
 
 if (DB == -1) { Print ("Connection failed! Error: "+MySqlErrorDescription); return; } else { Print ("Connected! DBID#",DB);}
 
 // ejecución de la sentencia SELECT
 string Query0,Query1,Query2,Query3,Query4,Query5,Query6,Query7;
 int    i,Cursor1,Cursor3,Cursor5,Cursor7,Rows,total;
 
 int      vId;
 string   vCode;
 datetime vStartTime;
 
 Query0 = "DROP TABLE IF EXISTS `test_table`";
 MySqlExecute(DB, Query0);
 
 Query0 = "CREATE TABLE `test_table` (id int, code varchar(50), start_date datetime)";
 if (MySqlExecute(DB, Query0))  {
     Print ("Table `test_table` created.");
 }
 else  {
     Print ("Table `test_table` cannot be created. Error: ", MySqlErrorDescription);
 }
 
 //--- insertar datos
 Query0 = "INSERT INTO `test_table` (id, code, start_date) VALUES ("+(string)AccountNumber()+",\'ACCOUNT\',\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')";
  if (MySqlExecute(DB, Query0))   {
      Print ("Succeeded: ", Query0);
  }
  else  {
      Print ("Error: ", MySqlErrorDescription);
      Print ("Query: ", Query0);
  }
  
  // multi-insert
  Query0 =          "INSERT INTO `test_table` (id, code, start_date) VALUES (1,\'EURUSD\',\'2014.01.01 00:00:01\');";
  Query0 = Query0 + "INSERT INTO `test_table` (id, code, start_date) VALUES (2,\'EURJPY\',\'2014.01.02 00:02:00\');";
  Query0 = Query0 + "INSERT INTO `test_table` (id, code, start_date) VALUES (3,\'USDJPY\',\'2014.01.03 03:00:00\');";
  if (MySqlExecute(DB, Query0))   {
      Print ("Succeeded! 3 rows has been inserted by one query.");
  }
  else  {
      Print ("Error of multiple statements: ", MySqlErrorDescription);
  }

 //--- select query, need Cursor ----
 Query1 = "SELECT id, code, start_date FROM `test_table`";
 Print ("SQL> ", Query1);
 Cursor1 = MySqlCursorOpen(DB, Query1);
 
 if (Cursor1 >= 0)  {
     Rows = MySqlCursorRows(Cursor1);
     Print (Rows, " row(s) selected.");
     for (i=0; i<Rows; i++) {
         if (MySqlCursorFetchRow(Cursor1))   {
             vId = MySqlGetFieldAsInt(Cursor1, 0); // id
             vCode = MySqlGetFieldAsString(Cursor1, 1); // código
             vStartTime = MySqlGetFieldAsDatetime(Cursor1, 2); // hora_inicio
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
         total += vId;
     }
     //--- insertar datos basados en la consulta
     Query2 = "INSERT INTO `test_table` (id, code, start_date) VALUES ("+(string)total+",\'ABCDEF\',\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\');  ";
     if (MySqlExecute(DB, Query2))  {
         Print ("Succeeded! 1 new row has been inserted.");
     }
     else  {
         Print ("Error inserting data based on SELECT query : ", MySqlErrorDescription);
     }
     //---
     MySqlCursorClose(Cursor1); // ¡¡¡NUNCA OLVIDES CERRAR EL CURSOR!!!
 }
 else  {
     Print ("Cursor1 opening failed. Error: ", MySqlErrorDescription);
 }
     
 //--- nuevo Cursor para select --- 
 Query3 = "SELECT id, code, start_date FROM `test_table`";
 Print ("SQL> ", Query3);
 Cursor3 = MySqlCursorOpen(DB, Query3);
 if (Cursor3 >= 0)  {
     Rows = MySqlCursorRows(Cursor3);
     Print (Rows, " row(s) selected.");
     for (i=0; i<Rows; i++) {
         if (MySqlCursorFetchRow(Cursor3))   {
             vId = MySqlGetFieldAsInt(Cursor3, 0); // id
             vCode = MySqlGetFieldAsString(Cursor3, 1); // código
             vStartTime = MySqlGetFieldAsDatetime(Cursor3, 2); // hora_inicio
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //--- actualizar datos ----
     Query4 = "UPDATE `test_table` SET id=8,code='PQRXYZ',start_date=\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\' WHERE code='ABCDEF';  ";
     if (MySqlExecute(DB, Query4))  {
         Print ("Succeeded! last row has been updated (code ABCDEF => PQRXYZ & new id=8.");
     }
     else  {
         Print ("Error updating data of last row : ", MySqlErrorDescription);
     }
     //---
     MySqlCursorClose(Cursor3); // ¡¡¡NUNCA OLVIDES CERRAR EL CURSOR!!!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 
 //--- mostrar resultado después de actualizado , se necesita nuevo cursor ---- 
 Query5 = "SELECT id, code, start_date FROM `test_table`";
 Print ("SQL> ", Query5);
 Cursor5 = MySqlCursorOpen(DB, Query5);
 if (Cursor5 >= 0)  {
     Rows = MySqlCursorRows(Cursor5);
     Print (Rows, " row(s) selected.");
     for (i=0; i<Rows; i++) {
         if (MySqlCursorFetchRow(Cursor5))   {
             vId = MySqlGetFieldAsInt(Cursor5, 0); // id
             vCode = MySqlGetFieldAsString(Cursor5, 1); // código
             vStartTime = MySqlGetFieldAsDatetime(Cursor5, 2); // hora_inicio
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //--- borrar consulta ---
     Query6 = "DELETE FROM `test_table` WHERE id=3;  ";
     if (MySqlExecute(DB, Query6))  {
         Print ("Succeeded! 1 row (id=3) has been deleted.");
     }
     else  {
         Print ("Error deleting 1 row : ", MySqlErrorDescription);
     }
     //---
     MySqlCursorClose(Cursor5); // ¡¡¡NUNCA OLVIDES CERRAR EL CURSOR!!!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 
 //--- mostrar resultado después de borrado, se necesita otro cursor --- 
 Query7 = "SELECT id, code, start_date FROM `test_table`";
 Print ("SQL> ", Query7);
 Cursor7 = MySqlCursorOpen(DB, Query7);
 if (Cursor7 >= 0)  {
     Rows = MySqlCursorRows(Cursor7);
     Print (Rows, " row(s) selected.");
     for (i=0; i<Rows; i++) {
         if (MySqlCursorFetchRow(Cursor7))   {
             vId = MySqlGetFieldAsInt(Cursor7, 0); // id
             vCode = MySqlGetFieldAsString(Cursor7, 1); // código
             vStartTime = MySqlGetFieldAsDatetime(Cursor7, 2); // hora_inicio
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //---
     MySqlCursorClose(Cursor7); // ¡¡¡NUNCA OLVIDES CERRAR EL CURSOR!!!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 //----- al final ---- 
 MySqlDisconnect(DB);
 Print ("Disconnected. Script done!");
}
//+------------------------------------------------------------------+




 
pedma:

Gran trabajo, muchas gracias Eugeniy.

Sus códigos me ayudan mucho, puedo ahorrar mucho tiempo. He intentado hacer INSERT, SELECT, UPDATE y DELETE consulta con éxito. Si no me equivoco, el "Cursor" es necesario sólo para la consulta SELECT?

= pedma




¡Exactamente hombre!

Los cursores utilizados sólo para la selección de datos porque tenemos que recibir los datos de la base de datos en la variable MQL, no sólo para enviar el comando sql a la base de datos.

Me alegro de que mi solución le ayuda.

Mucha suerte,

Eugene

 

Hola Eugene,

Me preguntaba si usted todavía hace proyectos de desarrollo pagados como estoy buscando para crear un copiador de comercio a distancia que se integra en un EA que voy a vender?

He mirado en Upwork y no parece que hayas realizado ningún proyecto freelance recientemente.

Hice un intento yo mismo usando la librería que creaste, pero no salió demasiado bien. Aunque estoy seguro de que sería fácil para alguien con tu capacidad de programación.

Gracias de antemano,

James

 
James Beach:

Hola Eugene,

Me preguntaba si usted todavía hace proyectos de desarrollo pagados como estoy buscando para crear un copiador de comercio a distancia que se integra en un EA que voy a vender?

He mirado en Upwork y no parece que hayas realizado ningún proyecto freelance recientemente.

Hice un intento yo mismo usando la librería que creaste, pero no salió demasiado bien. Aunque estoy seguro de que sería fácil para alguien con tu capacidad de programación.

Gracias de antemano,

James

Hola James

Estoy trabajando en Upwork sólo en un gran proyecto en la actualidad. Por lo tanto, no tienen mucho tiempo libre en la actualidad. ¿Cuál es el problema que tienes con las librerías? ¿Cómo puedo ayudarte?