MQ4에 MySQL 연결 - 페이지 2

 
MySql에서 작동하지 않았지만 MS SQL에 고정됨
 
MQL4에서 mysql_fetch_row 함수의 결과를 읽는 방법은 무엇입니까?
 
sergeev :

MQL4에서 mysql_fetch_row 함수의 결과를 읽는 방법은 무엇입니까?

저는 현재 MySQL 데이터베이스 읽기, 삽입, 삭제 및 수정 작업을 위한 스크립트를 개발 중입니다.

스크립트는 방대하지만 데이터베이스 작업의 본질은 하나의 기능에서 명확해질 것이라고 생각합니다.

사실, 이 예에서 레코드 ID는 테이블에서 반환되지만 다시 만드는 데 문제가 없을 것입니다. 데이터베이스에서 텍스트와 숫자를 반환한 것을 기억합니다. 모든 것이 제대로 작동했습니다.

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

약간의 조사를 했다

두 개의 필드 가 있는 테이블 생성
INT 아이디; TEXT 사용자

테이블에 두 개의 행이 있습니다
아이디 사용자
1아아아
2bb

1. "SELECT id FROM table"을 쿼리할 때 fetch_row 함수는 (address)(address) 1 (address)(address) 2 를 반환합니다.
2. "SELECT user FROM table"을 쿼리할 때 fetch_row 함수는 (address)(address) aaa (address)(address) bbb 를 반환합니다.

일반적으로 이것으로 작업할 수 있습니다. 반환값이 문자열로 이동하는 것은 유감입니다.

3. 두 필드 "SELECT id, user FROM table"을 요청하면 함수는 (주소)(주소)(주소) 1 (주소)(주소)(주소) 2 를 반환합니다.
4. "SELECT user, id FROM table" 필드를 바꾸면 함수는 (address)(address)(address) aaa (address)(address)(address) bbb 를 반환합니다.

행의 첫 번째 필드 하나만 명확하게 볼 수 있고 다른 4바이트 주소가 추가된 것으로 나타났습니다.

 
sergeev :

약간의 연구를 했다

두 개의 필드가 있는 테이블 생성
INT 아이디; TEXT 사용자

테이블에 두 개의 행이 있습니다
아이디 사용자
1아아아
2bb

1. "SELECT id FROM table"을 쿼리할 때 fetch_row 함수는 (address)(address) 1 (address)(address) 2 를 반환합니다.
2. "SELECT user FROM table"을 쿼리할 때 fetch_row 함수는 (address)(address) aaa (address)(address) bbb 를 반환합니다.

일반적으로 이것으로 작업할 수 있습니다. 반환값이 문자열로 이동하는 것은 유감입니다.

3. 두 필드 "SELECT id, user FROM table"을 요청하면 함수는 (주소)(주소)(주소) 1 (주소)(주소)(주소) 2 를 반환합니다.
4. "SELECT user, id FROM table" 필드를 바꾸면 함수는 (address)(address)(address) aaa (address)(address)(address) bbb 를 반환합니다.

행의 첫 번째 필드 하나만 명확하게 볼 수 있고 다른 4바이트 주소가 추가된 것으로 나타났습니다.


그러면 어떻게 프로그램에 적용할 수 있습니까?

저는 기본적으로 부동 소수점 숫자를 쓰고 읽을 것입니다.

 
HIDDEN :

저는 현재 MySQL 데이터베이스 읽기, 삽입, 삭제 및 수정 작업을 위한 스크립트를 개발 중입니다.

스크립트는 방대하지만 데이터베이스 작업의 본질은 하나의 기능에서 명확해질 것이라고 생각합니다.

사실, 이 예에서 레코드 ID는 테이블에서 반환되지만 다시 만드는 데 문제가 없을 것입니다. 데이터베이스에서 텍스트와 숫자를 반환한 것을 기억합니다. 모든 것이 제대로 작동했습니다.


이것은 흥미로운 예이지만 숫자 데이터를 읽는 방법을 보여주지는 않습니다.

기본적으로 두 가지 작업에 대해 세 개의 열로 구성된 테이블이 있는 베이스를 사용하고 싶습니다.

1) 처음 두 열 읽기(인덱스 및 첫 번째 숫자 열)

그런 다음 MQ4 프로그램 내부의 숫자 열에서 가장 적합한 숫자를 선택합니다.

2) 이 숫자의 인덱스로 두 번째 열의 숫자를 읽습니다.

이를 위해 어떤 기능을 사용해야 합니까? 그리고 그들은 지정된 DLL에서 잘 작동합니까?

 
Eugene1 :


이것은 흥미로운 예이지만 숫자 데이터를 읽는 방법을 보여주지는 않습니다.


반환되는 내용과 방법을 확인하기 위해 최소한 한 줄의 코드를 작성했습니까?

HIDDEN은 이미 데이터베이스에서 단일 필드를 읽기 위한 완벽한 솔루션을 제공했습니다. 실행했어?

 
Graff :

이전 게시물에 코드가 나와 있는 MKL5용 ansi를 유니코드로 변환하는 변환기를 작성하는 데 도움이 된다면. MKL4용 작업 코드를 보내 드리겠습니다. MKL5용 클래스를 작성할 때도 도움이 될 것입니다.


MQL5에는 유니코드를 변환하는 기능이 있습니다. /ru/docs/convert/chararraytostring/ru/docs/convert/stringtochararray 를 보십시오.

함수 가져오기에서 문자열이 아니라 uchar 유형의 배열을 선언하십시오.

 
stringo :


함수 가져오기에서 문자열이 아니라 uchar 유형의 배열을 선언하십시오.


문제는 불행히도 이러한 문자열이 & 매개변수 중 하나가 아니라 함수의 결과로 반환된다는 것입니다.

mysql_fetch_row 는 행 배열에 대한 포인터 를 반환합니다. - char**

--------

아마도 누군가는 알고 있습니다 - char ** 배열에서 char* 문자열을 생성할 수 있는 커널의 저수준 함수가 있습니까?
(예: strcpy, strcat...)

유사하게 int* 배열에서 - 특정 요소를 가져오는 일종의 함수?
함수 자체가 이 작업에 직접적으로 사용되지 않더라도 :)

 

전체 코드 구현 ....

 #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 덤프 데이터베이스

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

작업의 결과