Collegare MySQL a MQ4 - pagina 2

 
Non ho lavorato con MySql, ma ho lavorato con MS SQL
 
come leggere il risultato della funzione mysql_fetch_row in MQL4 ?
 
sergeev:

come leggere il risultato della funzione mysql_fetch_row in MQL4 ?

Attualmente sto sviluppando uno script per lavorare con un database MySQL per leggere, inserire, cancellare e modificare.

Lo script è grande, ma l'essenza del lavoro con il database sarà comprensibile, credo, da una sola funzione.

Tuttavia, in questo esempio viene restituito l'ID del record dalla tabella, ma non sarà un problema da rifare, mi ricordo e il testo e i numeri restituiti dal database, tutto funziona.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#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));
}
 

ha fatto un piccolo esperimento investigativo

Ho creato una tabella con due campi
INT id; TEXT user

ci sono due righe nella tabella
id user
1 aaa
2 bbb

1. Quando si interroga "SELECT id FROM table", la funzione fetch_row restituisce (indirizzo)(indirizzo) 1 (indirizzo)(indirizzo) 2
2. La query "SELECT user FROM table", la funzione fetch_row restituisce (indirizzo) aaa (indirizzo) bbb

In generale, questo può essere gestito, l'unico peccato è che ritorna in stringa

Se interrogo due campi "SELECT id, user FROM table", la funzione restituisce (indirizzo) 1 (indirizzo) (indirizzo) (indirizzo) 2
4. Se si scambiano i campi "SELECT user, id FROM table", la funzione restituisce (indirizzo) aaa (indirizzo) bbb

si scopre che solo il primo campo della stringa è chiaramente visibile e viene aggiunto un altro indirizzo di 4 byte.

 
sergeev:

ha fatto un piccolo esperimento investigativo

ha creato una tabella con due campi
INT id; TEXT utente

la tabella ha due righe
id utente
1 aaa
2 bbb

1. Quando si interroga "SELECT id FROM table" la funzione fetch_row restituisce (indirizzo)(indirizzo) 1 (indirizzo)(indirizzo) 2
2. Quando si richiede "SELECT user FROM table" la funzione fetch_row restituisce (indirizzo) aaa (indirizzo) bbb

Generalmente può essere gestita, ma il ritorno è in stringa

3. se la funzione restituisce due campi "SELECT id, user FROM table", restituisce (indirizzo) 1 (indirizzo) (indirizzo) 2
4
. Se scambiamo i campi "SELECT user, id FROM table", la funzione restituisce (indirizzo) aaa (indirizzo) bbb

si scopre che solo il primo campo della stringa viene visto esplicitamente e viene aggiunto un altro indirizzo di 4 byte.


Come si fa a inserire questo nel programma dopo?

In pratica scriverò numeri in virgola mobile e li leggerò.

 
HIDDEN:

Attualmente sto sviluppando uno script per lavorare con un database MySQL per leggere, inserire, cancellare e modificare.

Lo script è grande, ma l'essenza del lavoro con il database sarà comprensibile, credo, da una sola funzione.

È vero, questo esempio restituisce ID record dalla tabella, ma per rifare nessun problema, mi ricordo e testo e numeri restituiti dal database, tutto ha funzionato.


Questo è un esempio interessante, ma non mostra come leggere i dati numerici.

In pratica, voglio usare una base con una tabella di tre colonne per due sole azioni:

1) Leggere le prime due colonne (indice e la prima colonna numerica)

Poi scegliete il numero più rilevante dalla colonna numerica all'interno del programma MQ4

2) Leggere dall'indice di quel numero il numero della seconda colonna.

Quali funzioni dovrei usare per questo? E funzionano normalmente nella DLL specificata?

 
Eugene1:


Questo è un esempio interessante, ma non mostra come leggere i dati numerici.


avete scritto una riga di codice per vedere cosa viene restituito e come?

HIDDEN ha già dato una soluzione completa per leggere un campo dal database.

 
Graff:

Se potete aiutare a scrivere un convertitore da ansi a unicode per MKL5, il cui codice è riportato nel post precedente. Vi invierò il codice di lavoro per MKL4, vi aiuterà anche quando scriverete la classe per MKL5.


MQL5 ha funzioni per convertire l'unicode. Vedere /en/docs/convert/chararraytostring e /en/docs/convert/string tochararray

Dichiarare array uchar invece di stringhe nell'importazione di funzioni.

 
stringo:


Nelle funzioni di importazione, non dichiarare stringhe, ma array di tipo uchar


Il problema è, purtroppo, che queste stringhe sono restituite come risultato di una funzione, non come uno dei suoi & parametri.

mysql_fetch_row restituisce un puntatore a un array di stringhe - char**

--------

qualcuno sa se ci sono funzioni di basso livello del kernel che possono restituire una stringa char ** da un array di char?
(come strcpy, strcat...)

e allo stesso modo da un array int* - qualche funzione lib per ottenere il suo elemento specifico?
anche se la funzione stessa non è progettata direttamente per questa operazione :)

 

Implementazione completa del codice....

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

dump SQL del database

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

Risultato del lavoro

Motivazione: