Attacher MySQL à MQ4 - page 2

 
Je n'ai pas travaillé avec MySql, mais avec MS SQL.
 
Comment lire le résultat de la fonction mysql_fetch_row dans MQL4 ?
 
sergeev:

comment lire le résultat de la fonction mysql_fetch_row dans MQL4 ?

Je suis en train de développer un script pour travailler avec une base de données MySQL pour lire, insérer, supprimer et modifier.

Le script est volumineux, mais l'essentiel du travail avec la base de données sera compréhensible, je pense, à partir d'une seule fonction.

Cependant, dans cet exemple, l'ID de l'enregistrement de la table est renvoyé, mais ce ne sera pas un problème à refaire, je me souviens et le texte et les chiffres renvoyés de la base de données, tout a fonctionné.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#import "libmysql.dll"
int mysql_init(int db);
int mysql_errno(int TMYSQL);
int mysql_real_connect(int TMYSQL, string host, string user, string password, string DB,int port,int socket,int clientflag);
int mysql_real_query(int TMSQL, string query, int length);
int mysql_store_result(int TMSQL); 
string mysql_fetch_row(int result); 
int mysql_num_rows(int result); 
void mysql_free_result(int result);
void mysql_close(int TMSQL);
int mysql_insert_id(int result);
#import

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int mysql; string query = ""; int myerr;

int CompanyID = 0;
int SymbolID = 0;
int LastRecordQuotesID = 0;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool connect() { 
   mysql = mysql_init(mysql); 
   if (mysql!=0) Print("allocated"); 
   string host="IP adress";          // меняем на своё
   string user="Login";              // меняем на своё
   string password="Password";       // меняем на своё
   string DB="db_base";              // меняем на своё
   int clientflag=0; 
   int port=3306; 
   string socket=""; 
   int res=mysql_real_connect(mysql,host,user,password,DB,port,socket,clientflag); 
   int err=GetLastError(); 
   if (res==mysql){
      Print("connected"); 
      return(true);
   } else {
      Print("error=",mysql," ",mysql_errno(mysql)," ");
      return(false);
   }
return(false);
} 

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   if(!connect()) return(0);
//----
   CompanyID = CompanyID(AccountCompany(), AccountServer());
//----
   mysql_close(mysql);
   return(0);
  }

//+--------------------------------------------------------------------------------------------+
//| Функция поиска и вставки названия компании и сервера для связи.                            |
//+--------------------------------------------------------------------------------------------+
//| Переменные:                                                                                |
//|            string AccCompany  - AccountCompany()                                           |
//|            string AccServer   - AccountServer()                                            |
//+--------------------------------------------------------------------------------------------+
int CompanyID(string AccCompany = "", string AccServer = ""){
   int count_records, result;
   string row = "";
   
   query = StringConcatenate("SELECT id FROM Company WHERE Company = \'",AccCompany,"\' AND `Server` = \'",AccServer,"\'");
   mysql_real_query(mysql,query,CountLength(query));
   myerr = mysql_errno(mysql);
   if(myerr > 0) Print("error=",myerr);
   result = mysql_store_result(mysql);
   count_records = Number_Of_Rows(result);
   
   if (count_records > 0){
      row = mysql_fetch_row(result);
      mysql_free_result(result);
      return( StrToInteger(StringSubstr(row, 8, StringLen(row)-1) ) );
   } else {
      query = StringConcatenate( "INSERT INTO `Company` (`Company`, `Server`) VALUES (\'",AccCompany ,"\', \'",AccServer,"\')");
      mysql_real_query(mysql,query,CountLength(query));
      myerr = mysql_errno(mysql);
      if(myerr > 0) Print("CompanyID(): error=",myerr);
      mysql_free_result(result);
      return(mysql_insert_id(mysql));
   }
}

//+--------------------------------------------------------------------------------------------+
//| Вспомогательная Функция подсчёта колличества символов в передаваемом запросе.              |
//+--------------------------------------------------------------------------------------------+
//| Переменные:                                                                                |
//|            string query  - Текстовая страка                                                |
//+--------------------------------------------------------------------------------------------+
int CountLength(string query){
   return(StringLen(query));
}

//+--------------------------------------------------------------------------------------------+
//| Вспомогательная Функция подсчёта колличества результатов из базы данных                    |
//+--------------------------------------------------------------------------------------------+
//| Переменные:                                                                                |
//|            int result  - Результат запроса                                                 |
//+--------------------------------------------------------------------------------------------+
int Number_Of_Rows(int result){
   return(mysql_num_rows(result));
}
 

a fait une petite expérience d'investigation

J'ai créé une table avec deux champs
INT id ; TEXT utilisateur

il y a deux lignes dans la table
id utilisateur
1 aaa
2 bbb

1. Lors de la requête "SELECT id FROM table", la fonction fetch_row renvoie (adresse)(adresse) 1 (adresse)(adresse) 2
2. Dans la requête "SELECT user FROM table", la fonction fetch_row renvoie (adresse) aaa (adresse) bbb

En général, cela peut être géré, le seul inconvénient est qu'il renvoie une chaîne de caractères.

Si j'interroge deux champs "SELECT id, user FROM table", la fonction renvoie (adresse) 1 (adresse) (adresse) (adresse) 2
4. Si nous échangeons les champs "SELECT user, id FROM table", la fonction renvoie (adresse) aaa (adresse) bbb

il s'avère que seul le premier champ de la chaîne est clairement visible et qu'une autre adresse de 4 octets est ajoutée.

 
sergeev:

a fait une petite expérience d'investigation

créé une table avec deux champs
INT id ; TEXT user

le tableau a deux rangées
id utilisateur
1 aaa
2 bbb

1. Lors d'une requête "SELECT id FROM table" la fonction fetch_row renvoie (adresse)(adresse) 1 (adresse)(adresse) 2
2. Lorsque l'on demande la fonction fetch_row "SELECT user FROM table", elle renvoie (adresse) aaa (adresse) bbb

En général, elle peut être traitée, mais le retour est une chaîne de caractères.

3. Si la fonction renvoie deux champs "SELECT id, user FROM table", elle renvoie (adresse) 1 (adresse) (adresse) 2
4
. Si nous échangeons les champs "SELECT user, id FROM table", la fonction renvoie (adresse) aaa (adresse) bbb

il s'avère que seul le premier champ de la chaîne est explicitement vu et qu'une autre adresse de 4 octets est ajoutée.


Comment l'intégrer ensuite dans le programme ?

Je vais essentiellement écrire des nombres à virgule flottante et les lire.

 
HIDDEN:

Je suis en train de développer un script pour travailler avec une base de données MySQL pour lire, insérer, supprimer et modifier.

Le script est volumineux, mais l'essentiel du travail avec la base de données sera compréhensible, je pense, à partir d'une seule fonction.

Il est vrai que cet exemple renvoie l'ID de l'enregistrement à partir de la table, mais pour le refaire, pas de problème, je me souviens du texte et des chiffres renvoyés par la base de données, tout a fonctionné.


Cet exemple est intéressant, mais il ne montre pas comment lire des données numériques.

En gros, je veux utiliser une base avec un tableau de trois colonnes pour seulement deux actions :

1) Lire les deux premières colonnes (index et première colonne numérique)

Choisissez ensuite le numéro le plus pertinent dans la colonne numérique du programme MQ4.

2) Lisez le nombre de la deuxième colonne en utilisant l'indice de ce nombre.

Quelles fonctions dois-je utiliser pour cela ? Et fonctionnent-ils normalement dans la DLL spécifiée ?

 
Eugene1:


Cet exemple est intéressant, mais il ne montre pas comment lire des données numériques.


Avez-vous écrit une ligne de code pour voir ce qui est renvoyé et comment ?

HIDDEN a déjà donné une solution complète pour lire un champ de la base de données. L'avez-vous exécutée ?

 
Graff:

Si vous pouvez aider à écrire un convertisseur ansi vers unicode pour MKL5, dont le code est donné dans le post précédent. Je vous enverrai le code de travail pour MKL4, il vous aidera également à écrire la classe pour MKL5.


MQL5 dispose de fonctions pour convertir l'unicode. Voir /fr/docs/convert/chararraytostring et /fr/docs/convert/stringtochararray.

Déclarer des tableaux uchar au lieu de chaînes de caractères dans l'importation de fonctions.

 
stringo:


Dans les fonctions d'importation, ne déclarez pas des chaînes de caractères, mais des tableaux de type uchar.


Le problème est, malheureusement, que ces chaînes sont renvoyées comme résultat d'une fonction, et non comme l'un de ses & paramètres.

mysql_fetch_row renvoie un pointeur vers un tableau de chaînes de caractères - char**.

--------

quelqu'un sait-il s'il existe des fonctions de bas niveau du noyau qui peuvent retourner une chaîne de caractères ** à partir d'un tableau de caractères?
(comme strcpy, strcat...)

et de la même façon à partir d'un tableau d' int* - une fonction de la librairie pour récupérer son élément spécifique ?
même si la fonction elle-même n'est pas conçue pour cette opération directement :)

 

Mise en œuvre du code complet....

#import "libmysql.dll"
int mysql_init(int db);
int mysql_errno(int TMYSQL);
int mysql_real_connect(int TMYSQL, string host, string user, string password, string DB,int port,int socket,int clientflag);
int mysql_real_query(int TMSQL, string query, int length);
int mysql_store_result(int TMSQL); 
string mysql_fetch_row(int result); 
int mysql_num_rows(int result); 
void mysql_free_result(int result);
void mysql_close(int TMSQL);
int mysql_insert_id(int result);
#import

#include <WinUser32.mqh>

int mysql; string query = ""; int myerr;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
   if(!connect()) return(0);
//----
   Print("Возвращаем ID из MySQL: ",Read_ID(10));
   Print("Возвращаем Integer из MySQL: ",Read_Integer(1));
   Print("Возвращаем Double из MySQL: ",DoubleToStr(Read_Double(1),8));
   Print("Возвращаем Datetime из MySQL: ",Read_Datetime(1)," (",StrToTime(Read_Datetime(1)),")");
   Print("Возвращаем Text из MySQL: ",Read_Text(1));
//----
   mysql_close(mysql);
   return(0);
  }
//+------------------------------------------------------------------+
bool connect() { 
   mysql = mysql_init(mysql); 
   if (mysql!=0) Print("allocated"); 
   string host="localhost"; 
   string user="root"; 
   string password=""; 
   string DB="mql4"; 
   int clientflag=0; 
   int port=3306; 
   string socket=""; 
   int res=mysql_real_connect(mysql,host,user,password,DB,port,socket,clientflag); 
   int err=GetLastError(); 
   if (res==mysql){
      Print("connected"); 
      return(true);
   } else {
      Print("error=",mysql," ",mysql_errno(mysql)," ");
      return(false);
   }
return(false);
} 

//+--------------------------------------------------------------------------------------------+
//| Читаем ID из MySQL                                                                         |
//+--------------------------------------------------------------------------------------------+
int Read_ID(int number = 0){
   int count_records, result;
   string row = "";
   
   query = StringConcatenate("SELECT id FROM MQL4_TEST WHERE `integer` = ", number);
   
   mysql_real_query(mysql,query,CountLength(query));
   myerr = mysql_errno(mysql);
   if(myerr > 0) Print("error=",myerr);
   result = mysql_store_result(mysql);
   count_records = Number_Of_Rows(result);
   
   if (count_records > 0){
      row = mysql_fetch_row(result);
      mysql_free_result(result);
      return( StrToInteger(StringSubstr(row, 8, StringLen(row)-1) ) );
   }
}

//+--------------------------------------------------------------------------------------------+
//| Читаем Integer из MySQL                                                                         |
//+--------------------------------------------------------------------------------------------+
int Read_Integer(int id = 0){
   int count_records, result;
   string row = "";
   
   query = StringConcatenate("SELECT `integer` FROM MQL4_TEST WHERE id = ", id);
   mysql_real_query(mysql,query,CountLength(query));
   myerr = mysql_errno(mysql);
   if(myerr > 0) Print("error=",myerr);
   result = mysql_store_result(mysql);
   count_records = Number_Of_Rows(result);
   
   if (count_records > 0){
      row = mysql_fetch_row(result);
      mysql_free_result(result);
      return( StrToInteger(StringSubstr(row, 8, StringLen(row)-1) ) );
   }
}

//+--------------------------------------------------------------------------------------------+
//| Читаем Double из MySQL                                                                         |
//+--------------------------------------------------------------------------------------------+
double Read_Double(int id = 0){
   int count_records, result;
   string row = "";
   
   query = StringConcatenate("SELECT `double` FROM MQL4_TEST WHERE id = ", id);
   mysql_real_query(mysql,query,CountLength(query));
   myerr = mysql_errno(mysql);
   if(myerr > 0) Print("error=",myerr);
   result = mysql_store_result(mysql);
   count_records = Number_Of_Rows(result);
   
   if (count_records > 0){
      row = mysql_fetch_row(result);
      mysql_free_result(result);
      return( StrToDouble(StringSubstr(row, 8, StringLen(row)-1) ) );
   }
}

//+--------------------------------------------------------------------------------------------+
//| Читаем Datetime из MySQL                                                                         |
//+--------------------------------------------------------------------------------------------+
string Read_Datetime(int id = 0){
   int count_records, result;
   string row = "";
   
   query = StringConcatenate("SELECT `datetame` FROM MQL4_TEST WHERE id = ", id);
   mysql_real_query(mysql,query,CountLength(query));
   myerr = mysql_errno(mysql);
   if(myerr > 0) Print("error=",myerr);
   result = mysql_store_result(mysql);
   count_records = Number_Of_Rows(result);
   
   if (count_records > 0){
      row = mysql_fetch_row(result);
      mysql_free_result(result);
      return( StringSubstr(row, 8, StringLen(row)-1) );
   }
}

//+--------------------------------------------------------------------------------------------+
//| Читаем Text из MySQL                                                                         |
//+--------------------------------------------------------------------------------------------+
string Read_Text(int id = 0){
   int count_records, result;
   string row = "";
   
   query = StringConcatenate("SELECT text FROM MQL4_TEST WHERE id = ", id);
   mysql_real_query(mysql,query,CountLength(query));
   myerr = mysql_errno(mysql);
   if(myerr > 0) Print("error=",myerr);
   result = mysql_store_result(mysql);
   count_records = Number_Of_Rows(result);
   
   if (count_records > 0){
      row = mysql_fetch_row(result);
      mysql_free_result(result);
      return( StringSubstr(row, 8, StringLen(row)-1) );
   }
}
//+--------------------------------------------------------------------------------------------+
//| Вспомогательная Функция подсчёта колличества результатов из базы данных                    |
//+--------------------------------------------------------------------------------------------+
//| Переменные:                                                                                |
//|            int result  - Результат запроса                                                 |
//+--------------------------------------------------------------------------------------------+
int Number_Of_Rows(int result){
   return(mysql_num_rows(result));
}

//+--------------------------------------------------------------------------------------------+
//| Вспомогательная Функция подсчёта колличества символов в передаваемом запросе.              |
//+--------------------------------------------------------------------------------------------+
//| Переменные:                                                                                |
//|            string query  - Текстовая страка                                                |
//+--------------------------------------------------------------------------------------------+
int CountLength(string query){
   return(StringLen(query));
}

vidage SQL de la base de données

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `MQL4_TEST`
-- ----------------------------
DROP TABLE IF EXISTS `MQL4_TEST`;
CREATE TABLE `MQL4_TEST` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `integer` int(11) DEFAULT NULL,
  `double` double(11,8) DEFAULT NULL,
  `datetame` datetime DEFAULT NULL,
  `text` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=cp1251;

-- ----------------------------
-- Records of MQL4_TEST
-- ----------------------------
INSERT INTO `MQL4_TEST` VALUES ('1', '10', '20.12345678', '2011-05-16 10:24:43', 'Тестирование MySQL и MQL4');

Résultat du travail

Raison: