Discussione sull’articolo "Come accedere al database MySQL da MQL5 (MQL4)" - pagina 7

 

Ok, vedo che hai scritto un expert advisor per questo scopo, ed è scritto senza le raccomandazioni che ho postato nell'articolo.

Quindi, procediamo passo dopo passo: 1.

1. La chiamata di " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " dovrebbe essere fatta all'interno di OnInit() invece che in OnTick(). 2. Si sta utilizzando cMySqlConnect per il database.

2. Si utilizza cMySqlConnect - è una funzione importata dalla DLL, si deve utilizzare la funzione MySqlConnect invece di cMySqlConnect !

3. Si deve chiamare la funzione MySqlDisconnect all'interno della funzione stundard OnDeinit().

4. Dovete controllare l'identificatore di connessione al database all'interno della funzione standard OnTick() per essere sicuri che la connessione sia avvenuta con successo.

Alla fine si otterrà l'aspetto seguente.

... your code
int DB = -1; // identificativo del database//--
... your code
int OnInit()
{
   DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); 

   if (DB != -1)
    {
    // connessione riuscita!
    // qui si deve definire la logica di creazione delle tabelle
   }
   return(INIT_SUCCEEDED);
}

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

void OnTick()
{
 // primo comando.
 if (DB==-1) return; // non fare alcuna azione quando non c'è connessione

 // Qui il codice senza la chiamata 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, vedo che hai scritto un expert advisor per questo scopo, ed è scritto senza le raccomandazioni che ho postato nell'articolo.

Quindi, procediamo passo dopo passo: 1.

1. La chiamata di " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " dovrebbe essere fatta all'interno di OnInit() invece che in OnTick(). 2. Si sta utilizzando cMySqlConnect per il database.

2. Si utilizza cMySqlConnect - è una funzione importata dalla DLL, si deve utilizzare la funzione MySqlConnect invece di cMySqlConnect !

3. Si deve chiamare la funzione MySqlDisconnect all'interno della funzione stundard OnDeinit().

4. Dovete controllare l'identificatore di connessione al database all'interno della funzione standard OnTick() per essere sicuri che la connessione sia avvenuta con successo.

Alla fine si otterrà l'aspetto seguente.

Grazie, proverò di nuovo e fornirò i risultati.
 
elugovoy:

Ok, vedo che hai scritto un expert advisor per questo scopo, ed è scritto senza le raccomandazioni che ho postato nell'articolo.

Quindi, procediamo passo dopo passo: 1.

1. La chiamata di " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " dovrebbe essere fatta all'interno di OnInit() invece che in OnTick(). 2. Si sta utilizzando cMySqlConnect per il database.

2. Si utilizza cMySqlConnect - è una funzione importata dalla DLL, si deve utilizzare la funzione MySqlConnect invece di cMySqlConnect !

3. Si deve chiamare la funzione MySqlDisconnect all'interno della funzione stundard OnDeinit().

4. Dovete controllare l'identificatore di connessione al database all'interno della funzione standard OnTick() per essere sicuri che la connessione sia avvenuta con successo.

Alla fine si otterrà l'aspetto seguente.

Ho cambiato passo per passo, ma il problema è ancora presente quando si utilizza l'esperto in un mt4 per quattro o più simboli. stampa " Violazione dell'accesso letto a 0x0000000B in '... .MQLMySQL.dll'
".

il codice è il seguente

<--


#include <MQLMySQL.mqh

int MySqlErrorNumber; // numero di errore recente di MySQL

string MySqlErrorDescription; // descrizione dell'errore


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

//| Funzione di inizializzazione dell'esperto & nbsp; |

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

int OnInit()

OnInit(); int OnInit()

EventSetTimer(timeSeconds);

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

if( DB == -1 )

{

Print("Il database non è connesso..."); if( DB == -1 ) { print("Il database non è connesso... "); }

}

return(INIT_SUCCEED); }

}

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

//| Funzione di deinizializzazione esperta |

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

void OnDeinit(const int reason)

{

MySqlDisconnect(DB);

EventKillTimer();

ObjectsDeleteAll();

}


void OnTimer()

{

//Alert(TimeCurrent());

OnTick();

}


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

//| Funzione di tick esperta & nbsp; |

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

void OnTick()

{

if( DB == -1 )

{

Alert("Il database non è connesso ... "); return; { Alert("Il database non è connesso...")

return; }

}

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

{

int account = AccountNumber();

string symbol = Symbol(); if( cmd !

se( cmd ! = "" && cmd ! = NULL )

{

symbol = cmd; }

}

symbolOrder = symbol + "_table";

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

ammissione = spread*MathPow(10, Digits).

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

Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)AccountNumber();

//Stampa(Query);

int Cursore1 = MySqlCursorOpen(DB, Query);

se (Cursore1 >= 0)

{

int Rows1 = MySqlCursorRows(Cursor1); int Cursor1 = MySqlCursorOpen(DB, Query); if (Cursor1 >= 0)

int dataRows1 = Rows1;

//Alert(dataRows);

if( dataRows1 > 0 )

{

Query = "update " + symbol + " set Bid = " + (string)Bid + ", Ask = " + ( stringa)Ask

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

+ ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS ) + " 'dove AccountNumber = "

+ (stringa)conto; // + "' e Simbolo = '" + simbolo + "'".

MySqlExecute(DB, Query);

MySqlCursorClose(Cursore1);

}

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

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

+ (stringa)account + ", '" + simbolo + "', "+ (stringa)Bid+", "+ (stringa)Ask + ", "

+ DoubleToStr(spread, cifre)

+ ", '" + (stringa)AccountCompany()

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

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

{

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

//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 doppio,"

+ "Memo char(50), "

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

MySqlExecute(DB, Query);

}

}

MySqlCursorClose(Cursor1); // NON DIMENTICARE MAI DI CHIUDERE IL CURSORE !!!!

}

}

}

-->

 
elugovoy:

Ok, vedo che hai scritto un expert advisor per questo scopo, ed è scritto senza le raccomandazioni che ho postato nell'articolo.

Quindi, procediamo passo dopo passo: 1.

1. La chiamata di " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " dovrebbe essere fatta all'interno di OnInit() invece che in OnTick(). 2. Si sta utilizzando cMySqlConnect per il database.

2. Si utilizza cMySqlConnect - è una funzione importata dalla DLL, si deve utilizzare la funzione MySqlConnect invece di cMySqlConnect !

3. Si deve chiamare la funzione MySqlDisconnect all'interno della funzione stundard OnDeinit().

4. Dovete controllare l'identificatore di connessione al database all'interno della funzione standard OnTick() per essere sicuri che la connessione sia avvenuta con successo.

Alla fine si otterrà l'aspetto seguente.

Il problema è che non può essere utilizzato in un mt4 per più di due simboli; se lo si utilizza per un solo simbolo, è normale; se lo si utilizza per quattro o più simboli, funziona bene, ma dopo pochi minuti stampa il problema "OnTick()". Dopo pochi minuti, viene stampato il problema "Access violation read to 0x0000000B in '...MQLMySQL.db'". .MQLMySQL.dll'".

Gli esempi sono tutti script, è stato eseguito solo una volta, si può provare un esperto chiamare la dll in quattro o più simboli in uno o due mt4, si può trovare il problema.

Sarebbe il dll ha bisogno di un rilascio memeoy o raccolta garbe?

 
MFC scarica le perdite premat uramente quando esce, invece di aspettare che il CRT
scarichi le perdite dopo la d istruzione dei dati statici, e questo causa &#959; segnalazioni di perdite spurie per gli oggetti che hanno allocato memoria prima che MFC fosse inizializzato e che quindi sono distrutti dopo l'uscita di MFC nbsp;
segnalazioni di perdite spurie per gli oggetti che hanno allocato memoria prima che MFC
fosse inizializzato e che quindi vengono distrutti dopo l' uscita di MFC. Questo è
comunemente osservato quando si utilizza la DLL MFC in un programma che utilizza anche
la DLL di runtime C++.
 

Salve ancora una volta.

In base al codice che ha fornito, immagino che lei sia nuovo di MQL.

Mi dispiace, non ho tempo per insegnarti, ma ho tempo per testare il software che ho sviluppato.

Mi dispiace, non ho tempo per insegnarti, ma ho tempo per testare il software che ho sviluppato. Quindi, ecco i log allegati.

Ho costruito un EA di prova per voi, basato sulla vostra logica: ogni tabella definita per ogni coppia di valute e può mantenere i dati di mercato online per diversi conti.

È possibile esaminare i log, non è stato generato alcun errore "Access violation...". È possibile esaminare i log, non è stato rilevato alcun errore "Violazione dell'accesso...".

Il problema non è nella libreria MQLMySQL.

Test di EA.

//+------------------------------------------------------------------+
//|& nbsp; &nbsp DFTest.mq4
//|& nbsp; 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; // Timer (secondi) non utilizzato ora

int DB;

int OnInit()
{
 SQLTrace = true; // per vedere tutte le query inviate al database
       EventSetTimer(Timer);
       DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); 
       if( DB == -1 )
       {
            Print("Database is not connected! Error: ", MySqlErrorDescription);
            return (INIT_FAILED);
       }
       
 // creare la tabella se non esiste
 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()
{
 // non si deve mai chiamare OnTick da OnTimer e viceversa.
 // l'obiettivo di queste due funzioni è diverso
}

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()+"`"; // se si deve usare come nome di tabella, si devono usare le virgolette, come buona prassi per i database MySQL.
     
 
 spread = (Ask - Bid);
 
 // eventualmente sarebbe meglio usare qualcosa del genere: 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);
     }
  }

} 

 

Questa è la giusta logica di utilizzo della libreria.

Grazie all'ottimizzazione si può anche non usare l'istruzione SELECT, ma solo eseguire l'istruzione UPDATE, quindi controllare se (MySqlRowsAffected()==0) significa che nessuna riga è stata aggiornata. Avete circa il 100% degli aggiornamenti, quindi applicate l'istruzione INSERT.

Avete circa il 100% degli aggiornamenti, quindi questo workaround può aumentare le prestazioni e ridurre il traffico di rete.

Alla fine, i codici sorgenti completi del progetto (incluso lo sviluppo della DLL) sono stati allegati all'articolo, e potete modificarli a vostro piacimento.

Se il problema risiede comunque in MqlMySQL.DLL, è possibile eseguire il debug e risolverlo da soli.

Auguri, Eugene

Eugene

File:
logs.zip  302 kb
 

Ottimo lavoro, grazie mille Eugeniy.

I tuoi codici mi aiutano molto, posso risparmiare molto tempo. Ho provato a fare query INSERT, SELECT, UPDATE e DELETE con successo. Se non sbaglio, il "Cursore" è necessario solo per le query SELECT?

= pedma

//+------------------------------------------------------------------+
//|MySQL-006.mq4 |
//|Copyright 2014, Eugene Lugovoy |
//| http://www.fxcodexlab.com |
//| Query di selezione, inserimento, aggiornamento e cancellazione|
//| modificato da : pedma|
//+------------------------------------------------------------------+

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

#include <MQLMySQL.mqh>

string INI;
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script|
//+------------------------------------------------------------------+
void OnStart() {
 string Host, User, Password, Database, Socket; // credenziali del database
 int Port,ClientFlag;
 int DB; // identificatore del database
 
 Print (MySqlVersion());

 INI = "C:\\This\\Must\\be\\Real\\Path\\To\\MyConnection.ini";
 
 // lettura delle credenziali del database dal file 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);
 
 // aprire la connessione al database
 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);}
 
 // esecuzione dell'istruzione 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);
 }
 
 //--- inserimento dei dati
 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);
  }
  
  // inserimento multiplo
  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);
  }

 //--- selezionare la query, serve il cursore ----
 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); // codice
             vStartTime = MySqlGetFieldAsDatetime(Cursor1, 2); // ora_inizio
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
         total += vId;
     }
     //-- inserire i dati in base alla query
     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); // NON DIMENTICATE MAI DI CHIUDERE IL CURSORE!!!
 }
 else  {
     Print ("Cursor1 opening failed. Error: ", MySqlErrorDescription);
 }
     
 //--- nuovo cursore per la selezione --- 
 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); // codice
             vStartTime = MySqlGetFieldAsDatetime(Cursor3, 2); // ora_inizio
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //--- aggiornare i dati ----
     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); // NON DIMENTICATE MAI DI CHIUDERE IL CURSORE!!!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 
 //--- mostra il risultato dopo l'aggiornamento, è necessario un nuovo cursore ---- 
 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); // codice
             vStartTime = MySqlGetFieldAsDatetime(Cursor5, 2); // ora_inizio
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //--- cancellare la query ---
     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); // NON DIMENTICATE MAI DI CHIUDERE IL CURSORE!!!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 
 //--- mostra il risultato dopo la cancellazione, è necessario un altro cursore --- 
 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); // codice
             vStartTime = MySqlGetFieldAsDatetime(Cursor7, 2); // ora_inizio
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //---
     MySqlCursorClose(Cursor7); // NON DIMENTICATE MAI DI CHIUDERE IL CURSORE!!!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 //----- alla fine ---- 
 MySqlDisconnect(DB);
 Print ("Disconnected. Script done!");
}
//+------------------------------------------------------------------+




 
pedma:

Ottimo lavoro, grazie mille Eugeniy.

I tuoi codici mi aiutano molto, posso risparmiare molto tempo. Ho provato a fare query INSERT, SELECT, UPDATE e DELETE con successo. Se non sbaglio, il "Cursore" è necessario solo per le query SELECT?

= pedma




Esattamente!

Il cursore viene utilizzato solo per la selezione dei dati perché dobbiamo ricevere i dati dal db in una variabile MQL, non solo per inviare il comando sql al database.

Sono contento che la mia soluzione ti sia stata d'aiuto.

Buona fortuna,

Eugene

 

Ciao Eugene,

Mi chiedevo se fai ancora progetti di sviluppo a pagamento, dato che sto cercando di creare un copiatore di scambi a distanza integrato in un EA che venderò.

Ho dato un'occhiata a Upwork e non mi sembra che tu abbia completato alcun progetto da freelance di recente.

Ho provato io stesso a utilizzare la libreria che hai creato, ma non è andata molto bene. Tuttavia, sono sicuro che sarebbe facile per qualcuno con le tue capacità di programmazione!

Grazie in anticipo,

Giacomo

 
James Beach:

Ciao Eugene,

Mi chiedevo se fai ancora progetti di sviluppo a pagamento, dato che sto cercando di creare un copiatore di scambi a distanza integrato in un EA che venderò.

Ho dato un'occhiata a Upwork e non mi sembra che tu abbia completato alcun progetto da freelance di recente.

Ho provato io stesso a utilizzare la libreria che hai creato, ma non è andata molto bene. Tuttavia, sono sicuro che sarebbe facile per qualcuno con le tue capacità di programmazione!

Grazie in anticipo,

Giacomo

Ciao James,

Attualmente sto lavorando su Upwork solo su un grande progetto. Quindi, non ho molto tempo libero al giorno d'oggi. Qual è il problema che hai con le librerie? Come posso aiutarti?