MySQL'i MQ4'e ekleyin - sayfa 2

 
MySql ile çalışmadı, ancak MS SQL'e bağlandı
 
MQL4'te mysql_fetch_row işlevinin sonucu nasıl okunur?
 
sergeev :

MQL4'te mysql_fetch_row işlevinin sonucu nasıl okunur?

Şu anda MySQL veritabanı okuma, ekleme, silme ve değiştirme ile çalışmak için bir komut dosyası geliştiriyorum.

Komut dosyası hacimlidir, ancak veritabanıyla çalışmanın özü, bence tek bir işlevden netleşecektir.

Doğru, bu örnekte, kayıt kimliği tablodan döndürülür, ancak yeniden yapmak sorun olmaz, veritabanından metin ve sayıları döndürdüğümü hatırlıyorum, her şey çalıştı.

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

biraz araştırma yaptım

iki alanlı bir tablo oluşturdu
INT kimliği; METİN kullanıcı

tabloda iki satır var
kimlik kullanıcısı
1 aaa
2bb

1. "Tablodan kimliği SEÇ" sorgulanırken, fetch_row işlevi (adres)(adres) 1 (adres)(adres) 2 değerini döndürür.
2. "Tablodan kullanıcı SEÇ" sorgulandığında, fetch_row işlevi (adres)(adres) aaa (adres)(adres) bbb döndürür

genel olarak, bununla çalışabilirsiniz, dönüşün dizgeye gitmesi üzücü

3. İki alan "SELECT id, user FROM tablosu" talep ederseniz, fonksiyon (adres)(adres)(adres) 1 (adres)(adres)(adres) 2 değerini döndürür.
4. "SEÇ kullanıcı, kimlik FROM tablosu" alanlarını değiştirirseniz, işlev (adres)(adres)(adres) aaa (adres)(adres)(adres) bbb döndürür

satırdan yalnızca bir ilk alanın açıkça görülebildiği ve 4 baytlık başka bir adresin eklendiği ortaya çıktı.

 
sergeev :

biraz araştırma yaptım

iki alanlı bir tablo oluşturdu
INT kimliği; METİN kullanıcı

tabloda iki satır var
kimlik kullanıcısı
1 aaa
2bb

1. "Tablodan kimliği SEÇ" sorgulanırken, fetch_row işlevi (adres)(adres) 1 (adres)(adres) 2 değerini döndürür.
2. "Tablodan kullanıcı SEÇ" sorgulandığında, fetch_row işlevi (adres)(adres) aaa (adres)(adres) bbb döndürür

genel olarak, bununla çalışabilirsiniz, dönüşün dizgeye gitmesi üzücü

3. İki alan "SELECT id, user FROM tablosu" talep ederseniz, fonksiyon (adres)(adres)(adres) 1 (adres)(adres)(adres) 2 değerini döndürür.
4. "SEÇ kullanıcı, kimlik FROM tablosu" alanlarını değiştirirseniz, işlev (adres)(adres)(adres) aaa (adres)(adres)(adres) bbb döndürür

satırdan yalnızca bir ilk alanın açıkça görülebildiği ve 4 baytlık başka bir adresin eklendiği ortaya çıktı.


O zaman programa nasıl alınır?

Temelde kayan nokta sayıları yazıp okuyacağım.

 
HIDDEN :

Şu anda MySQL veritabanı okuma, ekleme, silme ve değiştirme ile çalışmak için bir komut dosyası geliştiriyorum.

Komut dosyası hacimlidir, ancak veritabanıyla çalışmanın özü, bence tek bir işlevden netleşecektir.

Doğru, bu örnekte, kayıt kimliği tablodan döndürülür, ancak yeniden yapmak sorun olmaz, veritabanından metin ve sayıları döndürdüğümü hatırlıyorum, her şey çalıştı.


Bu ilginç bir örnek, ancak sayısal verilerin nasıl okunacağını göstermiyor.

Temel olarak, yalnızca iki eylem için üç sütunlu bir tablo içeren bir taban kullanmak istiyorum:

1) İlk iki sütunu okuyun (dizin ve ilk sayısal sütun)

Ardından MQ4 programı içindeki sayısal sütundan en uygun sayıyı seçerek

2) İkinci sütundaki sayıyı bu sayının dizinine göre okuyun.

Bunun için hangi işlevleri kullanmalıyım? Ve belirtilen DLL'de düzgün çalışıyorlar mı?

 
Eugene1 :


Bu ilginç bir örnek, ancak sayısal verilerin nasıl okunacağını göstermiyor.


Neyin ve nasıl döndürüldüğünü görmek için en az bir satır kod yazdınız mı?

HIDDEN, bir veritabanından tek bir alanı okumak için zaten eksiksiz bir çözüm sağlamıştır. çalıştırdın mı?

 
Graff :

Kodu bir önceki gönderide verilen MKL5 için bir ansi'den unicode'a dönüştürücü yazmaya yardımcı olabilirseniz. Size MKL4 için çalışan bir kod göndereceğim, MKL5 için bir sınıf yazarken de yardımcı olacaktır.


MQL5, unicode'u dönüştürmek için işlevlere sahiptir. /ru/docs/convert/chararraytostring ve /ru/docs/convert/stringtochararray'e bakın

İşlev içe aktarmalarında, dizeleri değil, uchar türünde dizileri bildirin

 
stringo :


İşlev içe aktarmalarında, dizeleri değil, uchar türünde dizileri bildirin


sorun ne yazık ki bu dizelerin & parametrelerinden birinde değil , işlevin sonucu olarak döndürülmesidir.

mysql_fetch_row , bir dizi satıra bir işaretçi döndürür - char**

--------

belki biri biliyordur - çekirdekten char ** dizisinden char* dizesi üretebilen düşük seviyeli işlevler var mı?
(strcpy, strcat gibi...)

ve benzer şekilde bir int* dizisinden - belirli öğesini elde etmek için bir tür işlev mi?
işlevin kendisi doğrudan bu işlem için tasarlanmasa bile :)

 

Tam kod uygulaması....

 #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 dökümü veritabanı

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

çalışmanın sonucu