MQ4에 MySQL 연결 - 페이지 5

 
sergeev :

예, 모든 것이 완벽하게 작동하지만 지금까지는 MQL5에서만 수행했습니다.

내 게시물 위의 작업 예제


mysql_fetch_row와 관련된 코드 조각을 보낼 수 있습니다. 예제를 처리하면 결과가 여러 행과 열로 구성된 경우 셀을 가져오는 방법이 명확하지 않습니다.
 
Graff :

mysql_fetch_row와 관련된 코드 조각을 보낼 수 있습니다. 예제를 처리하면 결과가 여러 행과 열로 구성된 경우 셀을 가져오는 방법이 명확하지 않습니다.

비슷하게.

1. mysql_num_rows, mysql_num_fields 가져옴

2. 다음 행 mysql_fetch_row에 대한 포인터 배열에 대한 포인터와 필드 길이에 대한 포인터 mysql_fetch_lengths

3. 이 길이를 길이 배열에서 우리 배열로 가져옵니다(memcpy를 통해).

4. 필드에 대한 포인터 배열에 대한 포인터에서 필드에 대한 포인터 배열을 가져옵니다(mysql_num_fields를 호출하기 때문에).

5. 필드의 길이(fetch_lengths의 결과 배열 길이)와 필드 자체에 대한 포인터를 알고 있으면 memcpy를 통해 데이터를 각 필드의 uchar 배열로 가져옵니다.

6. 2번 항목으로 돌아갑니다.

 
HIDDEN :
꼬이고, 회전하고, 이런 식으로 4-ke에서 나에게 아무 일도 일어나지 않았습니다. 때로는 터미널조차도 완전히 빠져 나옵니다.

Kirill, 모든 것이 MQL4에서 작동합니다. 409 빌드에서 테스트됨

다음은 get in string의 예입니다.

 #import "libmysql.dll"
     int mysql_get_client_info(); // функция вернула char*
#import "msvcrt.dll"
     int strcpy( string strDestination, int strSource); // копируем NULL-строку из source в байтовый массив 
#import

void start()
{
     int ptr; string data= "123456789" ; 
    ptr=mysql_get_client_info(); // получили указатель на строку
    strcpy(data, ptr); // скопировали его в массив
     Print ( "client_info=" +data); // вывели на печать
}

결과
!sql USDCHF,M30: client_info=6.0.0

마찬가지로 전체 배열에 대해 수행되는 경우
로 대체되어야 합니다

     int strcpy( int &strDestination[], int strSource); // копируем NULL-строку из source в байтовый массив 
 
sergeev :

Kirill, MQL4에서는 모든 것이 작동합니다. 409 빌드에서 테스트됨

다음은 get in string의 예입니다.

결과
!sql USDCHF,M30: client_info=6.0.0

마찬가지로 전체 배열에 대해 수행되는 경우
로 대체되어야 합니다

같은 빌드를 가지고 있지만 터미널이 충돌합니다.... 다른 DC의 다른 터미널에서 시도해야 합니다.

이것은 Windows에 따라 다를 수 있지만 win7 x64에서 테스트하고 있습니다.

 

HIDDEN :


xp/32

그런 다음 다른 콜 옵션을 파고 이 버그에 대해 서비스 데스크에 즉시 글을 쓰십시오.

아마도 그들은 당신에게 뭔가를 하라고 조언할 수 있습니다.

 
sergeev :

비슷하게.

1. mysql_num_rows, mysql_num_fields 가져옴

2. 다음 행 mysql_fetch_row에 대한 포인터 배열에 대한 포인터와 필드 길이에 대한 포인터 mysql_fetch_lengths

3. 이 길이를 길이 배열에서 우리 배열로 가져옵니다(memcpy를 통해).

4. 필드에 대한 포인터 배열에 대한 포인터에서 필드에 대한 포인터 배열을 가져옵니다(mysql_num_fields를 호출하기 때문에).

5. 필드의 길이(fetch_lengths의 결과 배열 길이)와 필드 자체에 대한 포인터를 알고 있으면 memcpy를 통해 데이터를 각 필드의 uchar 배열로 가져옵니다.

6. 2번 항목으로 돌아갑니다.



거의 알았습니다. 이 단계에서는 각 행의 첫 번째 셀만 검색할 수 있습니다. 어떤 이유로 memcpy 는 첫 번째 요소만 내 배열에 복사합니다. 저녁 내내 죽였습니다. 내가 무엇을 잘못하고 있지?

소스, 덤프, 애플리케이션에 로그인합니다.

파일:
 
Graff :


거의 알았습니다. 이 단계에서는 각 행의 첫 번째 셀만 검색할 수 있습니다. 어떤 이유로 memcpy는 첫 번째 요소만 내 배열에 복사합니다. 저녁 내내 죽였습니다. 내가 무엇을 잘못하고 있지?

소스, 덤프, 애플리케이션에 로그인합니다.


댓글이 있다

1. UNICODE2ANSI 기능을 전혀 사용할 필요가 없습니다. 이러한 목적을 위해 CharArrayToStr 및 ShortArrayToStr이 있습니다.

2. 함수 strcpy(string strDestination, int strSource)에서 문자열 사용; 나는 시도하지 않았고 배열을 통해 모든 것을했습니다. 데이터베이스의 UTF 인코딩에서 복사하고 있다는 것을 알고 있다면 데이터를 짧은 배열로 만드는 것이 좋습니다.

3. 여기에 기술적인 오류가 있습니다(이로 인해 모든 것이 잘못됨)
memcpy(alens,lens, num_fields );

uchar 유형의 1바이트 배열이 아닙니다. memcpy(alens,lens, num_fields *sizeof(int) ) 가 필요합니다.

 
sergeev :

댓글이 있다

1. UNICODE2ANSI 기능을 전혀 사용할 필요가 없습니다. 이러한 목적을 위해 CharArrayToStr 및 ShortArrayToStr이 있습니다.

2. 함수 strcpy(string strDestination, int strSource)에서 문자열 사용; 나는 시도하지 않았고 배열을 통해 모든 것을했습니다. 데이터베이스의 UTF 인코딩에서 복사하고 있다는 것을 알고 있다면 데이터를 짧은 배열로 만드는 것이 좋습니다.

3. 여기에 기술적인 오류가 있습니다(이로 인해 모든 것이 잘못됨)
memcpy(alens,lens, num_fields );

uchar 유형의 1바이트 배열이 아닙니다. memcpy(alens,lens, num_fields *sizeof(int) ) 가 필요합니다.



고맙습니다! 벌었다. 근육 작업을 위한 클래스나 라이브러리를 출시할 계획입니까?
 
Graff :

고맙습니다! 벌었다. 근육 작업을 위한 클래스나 라이브러리를 출시할 계획입니까?

필요하면 할 수 있습니다. 너무 명확한 것을 설명해야합니까? ...

이 libmysql에는 50개의 함수가 있습니다...

순수한 서비스의 절반 이상. 작업에 필요한 수십.

--------

그러나 일반적으로 이 클래스나 라이브러리를 어떻게 보십니까? 어떤 기능이 있어야합니까?

API 함수를 복제하거나 하나의 함수에 일부 작업 세트를 설정하시겠습니까?

 
sergeev :

필요하면 할 수 있습니다. 너무 명확한 것을 설명해야합니까? ...

이 libmysql에는 50개의 함수가 있습니다...

게다가 절반 이상이 순전히 서비스입니다. 작업에 필요한 수십.

--------

그러나 일반적으로 이 클래스나 라이브러리를 어떻게 보십니까? 어떤 기능이 있어야합니까?



libmysql.dll의 기능을 설명하는 것만으로는 충분하지 않다고 생각합니다. 클래스는 사용자에게 데이터베이스를 쉽고 간편하게 작업할 수 있는 기능을 제공해야 합니다.

예 1: 데이터베이스에 연결합니다. 내 연약한 클래스를 통해 데이터베이스에 연결하려면 클래스 생성자 를 호출해야 합니다. 비록 내부에는 항상 필요하지 않고 알아야 하는 여러 작업이 있습니다.

CMYSQL2::CMYSQL2( const string host= "localhost" , const string user= "root" , const string password= "" , const string database= "database" , const uint port= 3306 )
  {
   uchar _host[],_user[],_password[],_database[],_socket[];
   StringToCharArray (host,_host);
   StringToCharArray (user,_user);
   StringToCharArray (password,_password);
   StringToCharArray (database,_database);
// Connecting
   mysql=mysql_init( NULL );
   uint conn=mysql_real_connect(mysql,_host,_user,_password,_database,port,_socket, 0 );
   if (mysql== NULL || conn== NULL || mysql!=conn){ Print ( __FUNCTION__ , "-> MySQL connetion failure." );}
  }

예 2: 여러 줄 및 여러 열 결과 가져오기. 사용자가 필요로 하는 모든 것은 쿼리와 결과를 기록하기 위한 배열(구조)을 제공하는 것입니다.

 //+------------------------------------------------------------------+
//|  Returns string array as sql_results struct param and rows count
//+------------------------------------------------------------------+
uint CMYSQL2::GetArray( string query,sql_results & out [])
  {
   Query2(query);
   StoreResult();
   uint rows=GetNumRows();
   uint fields=GetNumFields();
   ArrayResize( out ,rows);

   for ( uint r= 0 ;r<rows;r++)
     {
      ArrayResize( out [r]. value ,fields);
       string fr_res=mysql_fetch_row(result);
      
       for ( uint f= 0 ;f<fields;f++)
        {
         out [r]. value [f]=get_cell_u(fr_res,f); //Print("3,",f,",",fields);
        }
     }
   FreeLastResult();
   return (rows);
  }

^ 이것은 아이디어를 이해하는 데 필요한 오래된 코드입니다.

또한 데이터베이스에 정보를 추가하는 많은 예가 있을 수 있습니다.

검사 없이 함수 집합만 사용하면 'libmysql.dll'에서 0x00000000으로 읽혀진 Access 위반에 걸리고 전체 시스템을 채우기가 매우 쉽습니다.

나는 근육 작업을위한 공개 수업의 공동 생성 가능성을 고려할 준비가되었습니다.