将MySQL连接到MQ4 - 页 2 1234567 新评论 Debugger 2011.05.15 16:16 #11 我没有用MySql工作,但我用过MS SQL。 --- 2011.05.15 17:21 #12 如何在MQL4中读取mysql_fetch_row 函数的结果? Nefedov Kirill 2011.05.15 20:32 #13 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)); } --- 2011.05.15 21:36 #14 做了一个小的调查实验 我创建了一个 有两个字段的表 INT id; TEXT user 表中有两行 id user 1 aaa 2 bbb 1.当查询 "SELECT id FROM table "时,fetch_row函数返回(address)(地址)1 (address)(地址) 2 2.在 "SELECT user FROM table "查询中,fetch_row函数返回(地址)aaa (地址) bbb 一般来说,这可以处理,唯一遗憾的是,它返回的是字符串 如果我查询两个字段 "SELECT id, user FROM table",函数返回(地址)1(地址)(地址)2 4.如果我们交换 "SELECT user, id FROM table "字段,函数返回(地址)aaa(地址)bbb 事实证明,只有字符串中的第一个字段是清晰可见的,另一个4字节的地址被添加。 Attach MySQL to MQ4 使用数据库 - DatabaseReadBind 使用数据库 - DatabasePrint Evgeny Potapov 2011.05.16 05:13 #15 sergeev: 做了一个小的调查实验 创建了一个有两个字段的表 INT id; TEXT user 该表有两行 id用户 1 aaa 2 bbb 1.当查询 "SELECT id FROM table "时,函数fetch_row返回(address)(地址)1 (地址)(地址) 2 2.当请求 "SELECT user FROM table "时,函数fetch_row返回(地址)aaa (地址) bbb 一般来说,它可以被处理,但返回是字符串。 3.如果函数返回两个字段 "SELECT id, user FROM table",则返回(地址)1(地址)(地址)2 4.如果我们交换 "SELECT user, id FROM table "字段,函数会返回(地址)aaa(地址)bbb 事实证明,只有字符串中的第一个字段被明确看到,另一个4字节的地址被添加。 之后,你如何将这一点纳入方案? 我主要是要写浮点数和读浮点数。 Evgeny Potapov 2011.05.16 05:24 #16 HIDDEN: 我目前正在开发一个脚本,与MySQL数据库一起工作,以读取、插入、删除和修改。 这个脚本很大,但我认为从一个函数中就可以理解与数据库工作的本质。 诚然,这个例子从表中返回记录ID,但重新制作没有问题,我记得从数据库返回的文本和数字,都工作了。 这是一个有趣的例子,但它并没有显示如何阅读数字数据。 基本上,我想用一个有三列表格的基础,只做两个动作。 1) 读取前两列(索引和第一个数字列)。 然后从MQ4程序的数字栏中选择最相关的数字 2)从该数字的索引中读出第二列的数字。 我应该用哪些函数来做这件事?而它们在指定的DLL中是否正常工作? --- 2011.05.16 08:50 #17 Eugene1: 这是一个有趣的例子,但它并没有显示如何阅读数字数据。 你有没有写过一行代码,看看返回的内容和方式? HIDDEN已经给出了一个完整的解决方案,从数据库中读取一个字段,你运行了吗? Slava 2011.05.16 10:03 #18 Graff: 如果你能帮助写出MKL5的ansi到unicode的转换器,其代码在之前的帖子中已经给出。我将把MKL4的工作代码发给你,这对你编写MKL5的类也会有帮助。 MQL5具有转换unicode的功能。参见/en/docs/convert/chararraytostring 和/en/docs/convert/stringtochararray。 在函数导入中声明uchar数组而不是字符串。 --- 2011.05.16 10:11 #19 stringo: 在导入函数中,不要声明字符串,而是声明Uchar类型的数组。 问题是,不幸的是,这些字符串是作为一个函数的结果 返回的,而不是作为其&参数之一。 mysql_fetch_row 返回一个 指向字符串数组的指针 -char** -------- 有谁知道是否有任何低级别的内核函数可以从一个char数组中返回一个char ** 字符串? (如strcpy,strcat...) 同样,从一个 int* 数组--一些lib函数来获取它的特定元素? 即使函数本身并不是直接为这种操作而设计的 :) Nefedov Kirill 2011.05.16 11:18 #20 全代码执行.... #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'); 工作成果 1234567 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
如何在MQL4中读取mysql_fetch_row 函数的结果?
我目前正在开发一个脚本,与MySQL数据库一起工作,以读取、插入、删除和修改。
这个脚本很大,但我认为从一个函数中就可以理解与数据库工作 的本质。
然而,在这个例子中,从表中返回的是记录的ID,但重新制作不会有问题,我记得从数据库中返回的文本和数字,一切都正常。
做了一个小的调查实验
我创建了一个 有两个字段的表
INT id; TEXT user
表中有两行
id user
1 aaa
2 bbb
1.当查询 "SELECT id FROM table "时,fetch_row函数返回(address)(地址)1 (address)(地址) 2
2.在 "SELECT user FROM table "查询中,fetch_row函数返回(地址)aaa (地址) bbb
一般来说,这可以处理,唯一遗憾的是,它返回的是字符串
如果我查询两个字段 "SELECT id, user FROM table",函数返回(地址)1(地址)(地址)2
4.如果我们交换 "SELECT user, id FROM table "字段,函数返回(地址)aaa(地址)bbb
事实证明,只有字符串中的第一个字段是清晰可见的,另一个4字节的地址被添加。
做了一个小的调查实验
创建了一个有两个字段的表
INT id; TEXT user
该表有两行
id用户
1 aaa
2 bbb
1.当查询 "SELECT id FROM table "时,函数fetch_row返回(address)(地址)1 (地址)(地址) 2
2.当请求 "SELECT user FROM table "时,函数fetch_row返回(地址)aaa (地址) bbb
一般来说,它可以被处理,但返回是字符串。
3.如果函数返回两个字段 "SELECT id, user FROM table",则返回(地址)1(地址)(地址)2
4.如果我们交换 "SELECT user, id FROM table "字段,函数会返回(地址)aaa(地址)bbb
事实证明,只有字符串中的第一个字段被明确看到,另一个4字节的地址被添加。
之后,你如何将这一点纳入方案?
我主要是要写浮点数和读浮点数。
我目前正在开发一个脚本,与MySQL数据库一起工作,以读取、插入、删除和修改。
这个脚本很大,但我认为从一个函数中就可以理解与数据库工作的本质。
诚然,这个例子从表中返回记录ID,但重新制作没有问题,我记得从数据库返回的文本和数字,都工作了。
这是一个有趣的例子,但它并没有显示如何阅读数字数据。
基本上,我想用一个有三列表格的基础,只做两个动作。
1) 读取前两列(索引和第一个数字列)。
然后从MQ4程序的数字栏中选择最相关的数字
2)从该数字的索引中读出第二列的数字。
我应该用哪些函数来做这件事?而它们在指定的DLL中是否正常工作?
这是一个有趣的例子,但它并没有显示如何阅读数字数据。
你有没有写过一行代码,看看返回的内容和方式?
HIDDEN已经给出了一个完整的解决方案,从数据库中读取一个字段,你运行了吗?
如果你能帮助写出MKL5的ansi到unicode的转换器,其代码在之前的帖子中已经给出。我将把MKL4的工作代码发给你,这对你编写MKL5的类也会有帮助。
MQL5具有转换unicode的功能。参见/en/docs/convert/chararraytostring 和/en/docs/convert/stringtochararray。
在函数导入中声明uchar数组而不是字符串。
在导入函数中,不要声明字符串,而是声明Uchar类型的数组。
问题是,不幸的是,这些字符串是作为一个函数的结果 返回的,而不是作为其&参数之一。
mysql_fetch_row 返回一个 指向字符串数组的指针 -char**
--------
有谁知道是否有任何低级别的内核函数可以从一个char数组中返回一个char ** 字符串?
(如strcpy,strcat...)
同样,从一个 int* 数组--一些lib函数来获取它的特定元素?
即使函数本身并不是直接为这种操作而设计的 :)
全代码执行....
数据库的SQL转储
工作成果