MySQL an MQ4 anbinden - Seite 2

 
Ich habe nicht mit MySql gearbeitet, sondern mit MS SQL
 
Wie liest man das Ergebnis der Funktion mysql_fetch_row in MQL4 ?
 
sergeev:

Wie liest man das Ergebnis der Funktion mysql_fetch_row in MQL4 ?

Ich entwickle gerade ein Skript, das mit einer MySQL-Datenbank arbeitet, um sie zu lesen, einzufügen, zu löschen und zu ändern.

Das Skript ist umfangreich, aber das Wesentliche der Arbeit mit der Datenbank wird, denke ich, durch eine Funktion verständlich.

Allerdings ist in diesem Beispiel ID des Datensatzes aus der Tabelle zurückgegeben, aber es wird nicht ein Problem sein, wieder zu machen, ich erinnere mich und Text und Zahlen aus der Datenbank zurückgegeben, alles funktioniert.

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

ein kleines Forschungsexperiment durchgeführt

Ich habe eine Tabelle mit zwei Feldernerstellt
INT id; TEXT user

es gibt zwei Zeilen in der Tabelle
id user
1 aaa
2 bbb

1. Bei der Abfrage "SELECT id FROM table" liefert die Funktion fetch_row (Adresse)(Adresse) 1 (Adresse)(Adresse) 2
2. Die Abfrage "SELECT user FROM table", die Funktion fetch_row gibt (Adresse) aaa (Adresse) bbb

Im Allgemeinen kann dies gehandhabt werden, die einzige Schande ist, dass es in String zurückgibt

Wenn ich zwei Felder abfrage "SELECT id, user FROM table", liefert die Funktion (Adresse) 1 (Adresse) (Adresse) (Adresse) 2
4. Wenn Sie die "SELECT user, id FROM table"-Felder vertauschen, gibt die Funktion (Adresse) aaa (Adresse) bbb

zurück. Es stellt sich heraus, dass nur das erste Feld der Zeichenkette deutlich sichtbar ist und eine weitere 4-Byte-Adresse hinzugefügt wird.

 
sergeev:

ein kleines Forschungsexperiment durchgeführt

eine Tabelle mit zwei Feldern erstellt
INT id; TEXT Benutzer

die Tabelle hat zwei Zeilen
id-Benutzer
1 aaa
2 bbb

1. Bei der Abfrage "SELECT id FROM table" liefert die Funktion fetch_row (Adresse)(Adresse) 1 (Adresse)(Adresse) 2
2. Bei der Abfrage "SELECT user FROM table" liefert die Funktion fetch_row (Adresse) aaa (Adresse) bbb

Im Allgemeinen kann es gehandhabt werden, aber die Rückgabe erfolgt als String

3. Wenn die Funktion "SELECT id, user FROM table" zwei Felder zurückgibt, liefert sie (Adresse) 1 (Adresse) (Adresse) 2
4
. Wenn wir die Felder "SELECT user, id FROM table" vertauschen, liefert die Funktion (Adresse) aaa (Adresse) bbb

stellt sich heraus, dass nur das erste Feld der Zeichenkette explizit gesehen wird und eine weitere 4-Byte-Adresse hinzugefügt wird.


Wie bringen Sie dies anschließend in das Programm ein?

Ich werde im Grunde genommen Fließkommazahlen schreiben und sie lesen.

 
HIDDEN:

Ich entwickle gerade ein Skript, das mit einer MySQL-Datenbank arbeitet, um sie zu lesen, einzufügen, zu löschen und zu ändern.

Das Skript ist umfangreich, aber das Wesentliche der Arbeit mit der Datenbank wird, denke ich, durch eine Funktion verständlich.

Wahre, gibt dieses Beispiel Datensatz-ID aus der Tabelle, aber kein Problem zu remake, erinnere ich mich und Text und Zahlen aus der Datenbank zurückgegeben, alles funktioniert.


Dies ist ein interessantes Beispiel, aber es zeigt nicht, wie man numerische Daten liest.

Im Grunde möchte ich eine Basis mit einer dreispaltigen Tabelle für nur zwei Aktionen verwenden:

1) Lesen Sie die ersten beiden Spalten (Index und die erste numerische Spalte)

Wählen Sie dann die relevanteste Zahl aus der numerischen Spalte im MQ4-Programm

2) Lies aus dem Index dieser Zahl die Zahl in der zweiten Spalte.

Welche Funktionen sollte ich dafür verwenden? Und funktionieren sie normal in der angegebenen DLL?

 
Eugene1:


Dies ist ein interessantes Beispiel, aber es zeigt nicht, wie man numerische Daten liest.


Haben Sie eine Zeile Code geschrieben, um zu sehen, was zurückgegeben wird und wie?

HIDDEN hat bereits eine vollständige Lösung für das Auslesen eines Feldes aus der Datenbank gegeben. Haben Sie es ausgeführt?

 
Graff:

Wenn Sie helfen können, schreiben ansi zu Unicode-Konverter für MKL5, der Code von denen in der vorherigen Post gegeben ist. Ich schicke Ihnen den Arbeitscode für MKL4, er wird Ihnen auch beim Schreiben der Klasse für MKL5 helfen.


MQL5 hat Funktionen zur Umwandlung von Unicode. Siehe /de/docs/convert/chararraytostring und /de/docs/convert/stringtochararray

Deklarieren Sie uchar-Arrays anstelle von Strings im Funktionsimport.

 
stringo:


Deklarieren Sie in Importfunktionen keine Strings, sondern Arrays vom Typ uchar


Das Problem ist leider, dass diese Zeichenketten als Ergebnis einer Funktion zurückgegeben werden, nicht als einer ihrer & Parameter.

mysql_fetch_row gibt einen Zeiger auf ein Array von Strings zurück - char**

--------

weiß jemand, ob es irgendwelche Low-Level-Kernel-Funktionen, die eine char ** Zeichenfolge aus einem char-Array zurückgeben können?
(wie strcpy, strcat...)

und in ähnlicher Weise von einem int*-Array - eine Lib-Funktion, um sein spezifisches Element zu erhalten?
auch wenn die Funktion selbst nicht direkt für diesen Vorgang vorgesehen ist :)

 

Vollständiger Code Implementierung....

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

SQL-Dump der Datenbank

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

Arbeitsergebnis

Grund der Beschwerde: