MySQL'i MQ4'e ekleyin - sayfa 5

 
sergeev :

evet, her şey mükemmel çalışıyor, ancak şimdiye kadar sadece MQL5 için yaptım

yazımda yukarıdan çalışma örneği


Örneğiniz ile ilgili olarak mysql_fetch_row ile ilgili bir kod parçası gönderebilirsiniz, sonuç birkaç satır ve sütundan oluştuğunda hücrelerin nasıl getirileceği açık değildir.
 
Graff :

Örneğiniz ile ilgili olarak mysql_fetch_row ile ilgili bir kod parçası gönderebilirsiniz, sonuç birkaç satır ve sütundan oluştuğunda hücrelerin nasıl getirileceği açık değildir.

benzer şekilde.

1. mysql_num_rows, mysql_num_fields aldı

2. mysql_fetch_row sonraki satırına bir dizi göstericiye ve mysql_fetch_lengths alan uzunluklarına bir göstericiye sahip

3. uzunluk dizisinden bu uzunlukları dizimize çekin (memcpy aracılığıyla)

4. işaretçiden işaretçi dizisine, alanlara, bu işaretçi dizisini alanlara çekiyoruz (çünkü mysql_num_fields diyoruz)

5. Alanların uzunluklarını (getirme_uzunluklarından elde edilen uzunluk dizisi) ve alanların kendilerine işaretçilerini bilerek, verileri memcpy aracılığıyla her alanın uchar dizisine çekeriz.

6. 2. noktaya dönün.

 
HIDDEN :
Bükülmüş, bükülmüş ve bu şekilde ve bu, 4-ke'de bana hiçbir şey olmadı. Bazen terminal bile tamamen düşüyor.

Kirill, MQL4'te her şey benim için çalışıyor. 409 yapı üzerinde test edildi

işte string almak için bir örnek

 #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); // вывели на печать
}

sonuç
!sql USDCHF,M30: client_info=6.0.0

tüm dizi için yapılırsa benzer şekilde
ile değiştirilmelidir

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

Kirill, MQL4'te her şey benim için çalışıyor. 409 yapı üzerinde test edildi

işte string almak için bir örnek

sonuç
!sql USDCHF,M30: client_info=6.0.0

tüm dizi için yapılırsa benzer şekilde
ile değiştirilmelidir

Aynı yapıya sahibim ama terminal çöküyor.... Bunu farklı DC'lerin farklı terminallerinde denememiz gerekiyor.

Bu, Windows'a da bağlı olsa da, win7 x64 üzerinde test ediyorum.

 

HIDDEN :


xp/32

daha sonra farklı arama seçeneklerini araştırın ve bu hatayı hemen servis masasına yazın.

belki sana bir şeyler yapmanı tavsiye edebilirler.

 
sergeev :

benzer şekilde.

1. mysql_num_rows, mysql_num_fields aldı

2. mysql_fetch_row sonraki satırına bir dizi göstericiye ve mysql_fetch_lengths alan uzunluklarına bir göstericiye sahip

3. uzunluk dizisinden bu uzunlukları dizimize çekin (memcpy aracılığıyla)

4. işaretçiden işaretçi dizisine, alanlara, bu işaretçi dizisini alanlara çekiyoruz (çünkü mysql_num_fields diyoruz)

5. Alanların uzunluklarını (getirme_uzunluklarından elde edilen uzunluk dizisi) ve alanların kendilerine işaretçilerini bilerek, verileri memcpy aracılığıyla her alanın uchar dizisine çekeriz.

6. 2. noktaya dönün.



Neredeyse anladım. Bu aşamada, her satırın yalnızca ilk hücresi alınabilir. memcpy nedense dizilerime yalnızca ilk öğeyi kopyalar. Bütün akşam öldürdü. Neyi yanlış yapıyorum?

Kaynak, döküm, uygulamada oturum açın.

Dosyalar:
 
Graff :


Neredeyse anladım. Bu aşamada, her satırın yalnızca ilk hücresi alınabilir. memcpy nedense dizilerime yalnızca ilk öğeyi kopyalar. Bütün akşam öldürdü. Neyi yanlış yapıyorum?

Kaynak, döküm, uygulamada oturum açın.


yorumlar var

1. UNICODE2ANSI işlevlerini kullanmaya hiç gerek yoktur. Bu amaçlar için CharArrayToStr ve ShortArrayToStr'a sahipsiniz

2. strcpy(string strDestination, int strSource) işlevinde string kullanın; Denemedim, her şeyi diziler aracılığıyla yaptım. Veritabanının UTF kodlamasından kopyaladığınızı biliyorsanız, verileri kısa bir diziye sürmek daha iyidir.

3. burada teknik bir hata var (bu nedenle her şey ters gidiyor)
memcpy(alens,lens, num_fields );

uchar türünde tek baytlık bir dizi değil. memcpy(alens,lens, num_fields *sizeof(int) ) gerekir;

 
sergeev :

yorumlar var

1. UNICODE2ANSI işlevlerini kullanmaya hiç gerek yoktur. Bu amaçlar için CharArrayToStr ve ShortArrayToStr'a sahipsiniz

2. strcpy(string strDestination, int strSource) işlevinde string kullanın; Denemedim, her şeyi diziler aracılığıyla yaptım. Veritabanının UTF kodlamasından kopyaladığınızı biliyorsanız, verileri kısa bir diziye sürmek daha iyidir.

3. burada teknik bir hata var (çünkü her şey ters gidiyor)
memcpy(alens,lens, num_fields );

uchar türünde tek baytlık bir dizi değil. memcpy(alens,lens, num_fields *sizeof(int) ) gerekir;



Teşekkür ederim! kazanıldı. Kas ile çalışmak için bir sınıf veya kitaplık yayınlamayı planlıyor musunuz?
 
Graff :

Teşekkür ederim! kazanıldı. Kasla çalışmak için bir sınıf veya kitaplık yayınlamayı planlıyor musunuz?

eğer bir ihtiyaç varsa, o zaman yapabilirim. Neyin bu kadar net olduğunu açıklamama gerek var mı ...

bu libmysql'de 50 fonksiyon var...

dahası, yarısından fazlası tamamen hizmettir. iş için gereken düzinelerce.

--------

Ama genel olarak, bu sınıfı veya kütüphaneyi nasıl görüyorsunuz? hangi özelliklere sahip olmalı?

API işlevlerinin yalnızca kopyalarını yapın veya bir işlevde bazı eylem kümeleri ayarlayın?

 
sergeev :

eğer bir ihtiyaç varsa, o zaman yapabilirim. Neyin bu kadar net olduğunu açıklamama gerek var mı ...

bu libmysql'de 50 fonksiyon var...

dahası, yarısından fazlası tamamen hizmettir. iş için gereken düzinelerce.

--------

Ama genel olarak, bu sınıfı veya kütüphaneyi nasıl görüyorsunuz? hangi özelliklere sahip olmalı?



Sadece libmysql.dll'nin fonksiyonlarını tanımlamanın yeterli olmadığını düşünüyorum. Sınıf, kullanıcıya veritabanıyla kolay ve zahmetsizce çalışma yeteneği sağlamalıdır.

Örnek 1: bir veritabanına bağlanma. Veritabanına frail sınıfım aracılığıyla bağlanmak için , sınıf yapıcısını çağırmanız gerekir, ancak içeride her zaman ihtiyaç duymadığınız ve bilmeniz gerekmeyen bir dizi eylem vardır.

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." );}
  }

Örnek 2: çok satırlı ve çok sütunlu bir sonuç alma. Kullanıcının ihtiyacı olan tek şey sorguyu beslemek ve sonucu yazmak için bir dizi (yapı) sağlamaktır.

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

^ bu eski kod, fikri anlamak için gerekli.

Ayrıca veritabanına bilgi eklemenin birçok örneği olabilir.

Kontroller olmadan sadece bir dizi fonksiyon kullanırsanız, o zaman 'libmysql.dll'de 0x00000000'e okunan Erişim ihlaline girmek ve tüm sistemi doldurmak çok kolaydır.

Bir kasla çalışmak için açık bir sınıfın ortak oluşturulması olasılığını düşünmeye hazırım.