Discussion de l'article "Comment accéder à la base de données MySQL à partir de MQL5 (MQL4)" - page 7

 

Ok, je vois que vous avez écrit un conseiller expert à cette fin, et il est écrit sans les recommandations que j'ai postées dans l'article.

Passons donc à l'étape suivante : 1.

1. l'appel de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ; " devrait être fait dans la fonction standard OnInit() au lieu de OnTick(). au lieu de OnTick(). 2.

2. vous utilisez cMySqlConnect - c'est une fonction importée de la DLL, vous devez utiliser la fonction MySqlConnect au lieu de fonction cMySqlConnect !

3) Vous devez appeler la fonction MySqlDisconnect dans la fonction standard OnDeinit().

4. vous devez vérifier l'identifiant de connexion à la base de données dans la fonction standard OnTick() pour vous assurer que la connexion a réussi.

Au final, le programme ressemblera à ce qui suit.

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

   if (DB != -1)
    {
    // connexion réussie !
    // vous devez ici définir la logique de création de la table
   }
   return(INIT_SUCCEEDED);
}

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

void OnTick()
{
 // première commande.
 if (DB==-1) return; // ne rien faire en l'absence de connexion

 // voici votre code sans l'appel à 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, je vois que vous avez écrit un conseiller expert à cette fin, et il est écrit sans les recommandations que j'ai postées dans l'article.

Passons donc à l'étape suivante : 1.

1. l'appel de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ; " devrait être fait dans la fonction standard OnInit() au lieu de OnTick(). au lieu de OnTick(). 2.

2. vous utilisez cMySqlConnect - c'est une fonction importée de la DLL, vous devez utiliser la fonction MySqlConnect au lieu de fonction cMySqlConnect !

3) Vous devez appeler la fonction MySqlDisconnect dans la fonction standard OnDeinit().

4. vous devez vérifier l'identifiant de connexion à la base de données dans la fonction standard OnTick() pour vous assurer que la connexion a réussi.

Enfin, le résultat sera le suivant.

Merci, je vais réessayer et vous donner le résultat.
 
elugovoy:

Ok, je vois que vous avez écrit un conseiller expert à cette fin, et il est écrit sans les recommandations que j'ai postées dans l'article.

Passons donc à l'étape suivante : 1.

1. l'appel de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ; " devrait être fait dans la fonction standard OnInit() au lieu de OnTick(). au lieu de OnTick(). 2.

2. vous utilisez cMySqlConnect - c'est une fonction importée de la DLL, vous devez utiliser la fonction MySqlConnect au lieu de fonction cMySqlConnect !

3) Vous devez appeler la fonction MySqlDisconnect dans la fonction standard OnDeinit().

4. vous devez vérifier l'identifiant de connexion à la base de données dans la fonction standard OnTick() pour vous assurer que la connexion a réussi.

Finalement, le résultat ressemblera à ce qui suit.

Je l'ai modifié étape par étape, mais le problème persiste lorsque j'utilise l'expert dans un mt4 pour quatre symboles ou plus. il imprime " Access violation read to 0x0000000B dans '.... .MQLMySQL.dll'
"

Le code est le suivant

<--


#include <MQLMySQL.mqh

int MySqlErrorNumber ; // numéro de l'erreur MySQL récente

string MySqlErrorDescription ; // description de l'erreur


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

//| Fonction d'initialisation de l'expert & nbsp; |

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

int OnInit()

OnInit() ; int OnInit()

EventSetTimer(timeSeconds) ;

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

if( DB == -1 )

{

Print("La base de données n'est pas connectée...") ; if( DB == -1 ) { print("La base de données n'est pas connectée... ") ; }

}

return(INIT_SUCCEEDED) ; }

}

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

//| Fonction de désinitialisation de l'expert

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

void OnDeinit(const int reason)

{

MySqlDisconnect(DB) ;

EventKillTimer() ;

ObjectsDeleteAll() ;

}


void OnTimer()

{

//Alert(TimeCurrent()) ;

OnTick() ;

}


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

//| Fonction expert tick & nbsp; |

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

void OnTick()

{

if( DB == -1 )

{

Alert("La base de données n'est pas connectée ... ") ; return ; { Alert("La base de données n'est pas connectée ...")

return ; }

}

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

{

int account = AccountNumber() ;

string symbol = Symbol() ; if( cmd !

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

{

symbol = cmd ; }

}

symbolOrder = symbol + "_table" ;

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

admission = spread*MathPow(10, Digits).

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

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

//Print(Query) ;

int Cursor1 = MySqlCursorOpen(DB, Query) ;

if (Cursor1 >= 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 = " + ( chaîne)Ask

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

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

+ (string)account ; // + "' and Symbol = '" + symbol + "'".

MySqlExecute(DB, Query) ;

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), Bid double, Ask double, Spread double".

+ "Memo char(50), " + "Time datetime) ENGINEE

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

MySqlExecute(DB, Query) ;

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

+ (string)account + ", '" + symbol + "', "+(string)Bid+", "+ (string)Ask + ", "

+ DoubleToStr(spread, Digits)

+ ", '" + (chaîne)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 double," + "Memo char(50)

+ "Memo char(50), " + "Time datetime) ENGINEE

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

MySqlExecute(DB, Query) ;

}

}

MySqlCursorClose(Cursor1) ; // N'OUBLIEZ JAMAIS DE FERMER LE CURSEUR ! !!!

}

}

}

-->

 
elugovoy:

Ok, je vois que vous avez écrit un conseiller expert à cette fin, et il est écrit sans les recommandations que j'ai postées dans l'article.

Passons donc à l'étape suivante : 1.

1. l'appel de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ; " devrait être fait dans la fonction standard OnInit() au lieu de OnTick(). au lieu de OnTick(). 2.

2. vous utilisez cMySqlConnect - c'est une fonction importée de la DLL, vous devez utiliser la fonction MySqlConnect au lieu de fonction cMySqlConnect !

3) Vous devez appeler la fonction MySqlDisconnect dans la fonction standard OnDeinit().

4. vous devez vérifier l'identifiant de connexion à la base de données dans la fonction standard OnTick() pour vous assurer que la connexion a réussi.

Finalement, le programme ressemblera à ce qui suit.

Le problème est qu'il ne peut pas être utilisé dans un mt4 pour plus de deux symboles, s'il est utilisé pour un seul symbole, c'est normal. S'il est utilisé pour quatre symboles ou plus, il fonctionne bien, mais après quelques minutes, il affiche le problème "OnTick()". Après quelques minutes, il affiche le problème "Access violation read to 0x0000000B in '...MQLMySQL.db'". .MQLMySQL.dll'"

Vous pouvez essayer un expert qui appelle la dll dans quatre symboles ou plus dans un ou deux mt4, vous trouverez peut-être le problème.

La dll a peut être besoin d'une version memeoy ou d'une collection de garbe ?

 
MFC évacue les fuites prématuré ment lorsqu'il quitte, au lieu d'attendre que le CRT
évacue les fuites après la destruct ion des données statiques, ce qui provoque &#959; des rapports de fuites erronés pour les objets qui ont alloué de la mémoire avant l'initialisation de MFC et qui sont donc détruits après que MFC a quitté le système . nbsp ;
des rapports de fuites parasites pour les objets qui ont alloué de la mémoire avant l'initialisation du MFC
et qui sont donc détruits après la sortie du MFC. Ce phénomène est
souvent observé lors de l'utilisation de la DLL MFC dans un programme qui utilise également
la DLL d'exécution C++.
 

Bonjour encore une fois.

D'après le code que vous avez fourni, je suppose que vous êtes novice en matière de MQL.

Je suis désolé, je n'ai pas le temps de vous enseigner, mais j'ai le temps de tester le logiciel que j'ai développé.

Je suis désolé, je n'ai pas le temps de vous enseigner, mais j'ai le temps de tester le logiciel que j'ai développé. Voici donc les logs ci-joints.

J'ai construit un EA de test pour vous, basé sur votre logique : chaque table est définie pour chaque paire de devises et peut conserver les données du marché en ligne pour différents comptes.

Vous pouvez consulter les logs, aucune erreur "Access violation..." n'a été soulevée. Vous pouvez consulter les journaux, aucune erreur "Access violation..." n'a été soulevée.

Le problème n'est pas dans la bibliothèque MQLMySQL.

Test 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; // La minuterie (secondes) n'est pas utilisée pour l'instant

int DB;

int OnInit()
{
 SQLTrace = true; // pour voir toutes les requêtes envoyées à la base de données
       EventSetTimer(Timer);
       DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); 
       if( DB == -1 )
       {
            Print("Database is not connected! Error: ", MySqlErrorDescription);
            return (INIT_FAILED);
       }
       
 // créer une table si elle n'existe pas
 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()
{
 // il ne faut jamais appeler OnTick à partir de OnTimer et vice versa.
 // la cible de ces deux fonctions est différente
}

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 vous devez l'utiliser comme nom de table, vous devez utiliser des guillemets, ce qui est une bonne pratique pour les bases de données MySQL.
     
 
 spread = (Ask - Bid);
 
 // il est possible qu'il soit préférable d'utiliser quelque chose comme ceci : 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);
     }
  }

} 

 

C'est la bonne logique de l'utilisation de la bibliothèque.

En raison de l'optimisation, vous pouvez même ne pas utiliser l'instruction SELECT, mais simplement exécuter l'instruction UPDATE, puis vérifier si (MySqlRowsAffected()==0) signifie qu'aucune ligne n'a été modifiée. Vous avez ~100% des mises à jour, donc appliquez l'instruction INSERT.

Vous avez ~100% des mises à jour, donc cette solution peut augmenter les performances et réduire le trafic réseau.

Et à la fin, les codes sources complets du projet (y compris le développement de DLL) ont été joints à l'article, vous pouvez les modifier à votre guise.

Si vous pensez que le problème vient de MqlMySQL.DLL, vous pouvez le déboguer et le résoudre vous-même.

Meilleurs vœux, Eugene

Eugène

Dossiers :
logs.zip  302 kb
 

Excellent travail, merci beaucoup Eugeniy.

Vos codes m'ont beaucoup aidé, j'ai pu gagner beaucoup de temps. J'ai essayé de faire des requêtes INSERT, SELECT, UPDATE et DELETE avec succès. Si je ne me trompe pas, le "Cursor" n'est nécessaire que pour la requête SELECT ? ??

= pedma

//+------------------------------------------------------------------+
//|MySQL-006.mq4 |
//|Copyright 2014, Eugene Lugovoy |
//| http ://www.fxcodexlab.com
//| Requête de sélection, d'insertion, de mise à jour et de suppression|
//| modifié par : pedma|
//+------------------------------------------------------------------+

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

#include <MQLMySQL.mqh>

string INI;
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart() {
 string Host, User, Password, Database, Socket; // informations d'identification de la base de données
 int Port,ClientFlag;
 int DB; // identifiant de la base de données
 
 Print (MySqlVersion());

 INI = "C:\\This\\Must\\be\\Real\\Path\\To\\MyConnection.ini";
 
 // lecture des informations d'identification de la base de données à partir du fichier 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);
 
 // ouvrir la connexion à la base de données
 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);}
 
 // exécution de l'instruction 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);
 }
 
 //--- Insertion de données
 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); // code
             vStartTime = MySqlGetFieldAsDatetime(Cursor1, 2); // heure_de_début
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
         total += vId;
     }
     //--- insérer des données en fonction de la requête
     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); // NE JAMAIS OUBLIER DE FERMER LE CURSEUR ! !!
 }
 else  {
     Print ("Cursor1 opening failed. Error: ", MySqlErrorDescription);
 }
     
 //--- nouveau curseur pour la sélection --- 
 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); // code
             vStartTime = MySqlGetFieldAsDatetime(Cursor3, 2); // heure_de_début
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //--- mise à jour des données ----
     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); // NE JAMAIS OUBLIER DE FERMER LE CURSEUR ! !!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 
 //--- afficher le résultat après mise à jour, un nouveau curseur est nécessaire ---- 
 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); // code
             vStartTime = MySqlGetFieldAsDatetime(Cursor5, 2); // heure_de_début
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //--- supprimer la requête ---
     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); // NE JAMAIS OUBLIER DE FERMER LE CURSEUR ! !!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 
 //--- afficher le résultat après suppression, un autre curseur est nécessaire --- 
 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); // code
             vStartTime = MySqlGetFieldAsDatetime(Cursor7, 2); // heure_de_début
             Print ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
         }
     }
     //---
     MySqlCursorClose(Cursor7); // NE JAMAIS OUBLIER DE FERMER LE CURSEUR ! !!
 }
 else  {
     Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
 }
 //----- à la fin ---- 
 MySqlDisconnect(DB);
 Print ("Disconnected. Script done!");
}
//+------------------------------------------------------------------+




 
pedma:

Excellent travail, merci beaucoup Eugeniy.

Vos codes m'ont beaucoup aidé, j'ai pu gagner beaucoup de temps. J'ai essayé de faire des requêtes INSERT, SELECT, UPDATE et DELETE avec succès. Si je ne me trompe pas, le "Cursor" n'est nécessaire que pour la requête SELECT ? ??

= pedma




Exactement !

Les curseurs ne sont utilisés que pour la sélection des données parce que nous devons recevoir les données de la base de données dans une variable MQL, et pas seulement pour envoyer la commande sql à la base de données.

Je suis heureux que ma solution vous ait aidé.

Je vous souhaite bonne chance,

Eugène

 

Bonjour Eugène,

Je me demandais si vous faisiez toujours des projets de développement rémunérés car je cherche à créer un copieur de commerce à distance intégré à un système d'évaluation des risques que je vais vendre.

J'ai regardé sur Upwork et vous ne semblez pas avoir réalisé de projets en freelance récemment.

J'ai moi-même essayé d'utiliser la bibliothèque que vous avez créée, mais cela n'a pas très bien fonctionné. Pourtant, je suis sûr que ce serait facile pour quelqu'un avec vos compétences en programmation !

Merci d'avance,

Jacques

 
James Beach:

Bonjour Eugène,

Je me demandais si vous faisiez toujours des projets de développement rémunérés car je cherche à créer un copieur de commerce à distance intégré à un système d'évaluation des risques que je vais vendre.

J'ai regardé sur Upwork et vous ne semblez pas avoir réalisé de projets en freelance récemment.

J'ai moi-même essayé d'utiliser la bibliothèque que vous avez créée, mais cela n'a pas très bien fonctionné. Pourtant, je suis sûr que ce serait facile pour quelqu'un avec vos compétences en programmation !

Merci d'avance,

James

Bonjour James,

Je travaille sur Upwork uniquement sur un gros projet en ce moment. Je n'ai donc pas beaucoup de temps libre en ce moment. Quel est votre problème avec les librairies ? Comment puis-je vous aider ?