文章 "如何从 MQL5 (MQL4) 访问 MySQL 数据库" - 页 24

 
对缓存_sha2_password 的支持如何?有没有办法解决这个问题,或者我是否应该安装 mysql_native_password?
 
Dmitri Custurov:
对缓存_sha2_password 的支持如何?有什么办法可以解决这个问题,或者直接安装 mysql_native_password?

Hy 目前只支持本机。有人真的需要这个解决方案支持 sha2 吗?

您的数据库服务器不在本地,甚至不在 vpn 下?

 

你好 @EugeniyLugovoy,感谢你的辛勤工作!

在您当前版本的实现中,是否有办法在 INSERT 操作(在带有 AUTO_INCREMENT 列的表中)后检索 "LAST_INSERT_ID"?

在此先表示感谢,祝您愉快 :)
 
arsenico42:

你好 @EugeniyLugovoy,感谢你的辛勤工作!

在您当前版本的实现中,是否有办法在 INSERT 操作(在带有 AUTO_INCREMENT 列的表中)后检索 "LAST_INSERT_ID"?

在此先表示感谢,祝您愉快 :)


您好 arsenico42,您可以尝试在一个查询中进行插入操作,然后在另一个查询中选择 LAST_INSERT_ID,但我不推荐这种方法,因为 LAST_INSERT_ID 是返回全局数据库变量的函数,在您最初插入操作和选择 LAST_INSERT_ID 之间的另一个插入操作(来自另一个用户,同时运行)会影响 LAST_INSERT_ID 的值。

这并不取决于库,而是 mysql/mariadb 的工作方式。

不过,我可以建议你在数据库侧创建一个函数,插入所需的值,选择 LAST_INSERT_ID,并将此 ID 作为函数值返回:

CREATE FUNCTION `import_funds_add`(
        `p_file_name` varchar(64),
        `p_full_path` varchar(2000),
        `p_status` VARCHAR(10),
        `p_error` VARCHAR(2000)
)
RETURNS bigint(20)
LANGUAGE SQL
NOT DETERMINISTIC
MODIFIES SQL DATA
BEGIN
     declare id bigint;
     INSERT INTO import_funds(`file_name`, `full_path`, `status`, `error`, `creation_date`) 
     VALUES (p_file_name, p_full_path, p_status, p_error, now());
     SELECT LAST_INSERT_ID() INTO id;
     RETURN(id);
END;;

在 MQL 中,您必须打开游标进行查询:

qry="SELECT import_funds_add('bonuses.csv','c:\\broker imports\\XXX-FX','NEW','No errors') as last_id";

然后从通常的游标中获取值并关闭游标。

因此,与其在 MQL 中分别使用这些命令,还不如在 DB 端将它们合并到函数中。

这只是实际系统中的一个例子。

 
Carmine Marrone:

你好,埃卢戈沃伊

很棒的文章和很棒的图书馆。

我试图在 MT5 下使用您的示例,但却出现了这个错误:

2014.12.15 15:44:16.387 MySQL-001 'C:\Users\....\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\libraries\MQLMySQL.dll' is not 64-bit version

您是在 32 位环境下运行 MT5 吗?

你能帮我解决这个问题吗?

非常感谢!

卡明-马罗内

你好,Carmine,你可以从 github 上的源代码下载 x64 版本。

https://github.com/elugovoy/MQLMySQL-Project/tree/master/MQLMySQL/x64/Release

 

@Eugeniy Lugovoy,首先感谢你为社区做出的贡献。


我卡在这里了:

"Cannot load 'C:\Users\Admin\AppData\Roaming\MetaQuotes\Tester\D0E8209F77C8CF37AD8BF550E51FF075\Agent-127.0.0.1-3000\MQL5\libraries\MQLMySQL.dll'" [126]

"Cannot call 'ReadIni', '..\libraries\MQLMySQL.dll'没有加载"
 
MARCOS DALCIN ALVES DINIZ:

@Eugeniy Lugovoy,首先感谢你为社区做出的所有贡献


我卡在这里了:

"Cannot load 'C:\Users\Admin\AppData\Roaming\MetaQuotes\Tester\D0E8209F77C8CF37AD8BF550E51FF075\Agent-127.0.0.1-3000\MQL5\libraries\MQLMySQL.dll'" [126]

"Cannot call 'ReadIni', '..\libraries\MQLMySQL.dll'没有加载"

确保你的 MQLMySQL.dll 和 MQLMySQL.def 文件位于 "C:\Users\Admin\AppData\Roaming\MetaQuotes\Tester\D0E8209F77C8CF37AD8BF550E51FF075\Agent-127.0.0.1-3000\MQL5\libraries\" 文件夹中。

正如你所看到的,如果你在 Tester 模式下运行 MQL 程序,通向 libs 的路径会有所不同(因为 UAC 的原因)

 

多重插入时出错。

Query =         "INSERT INTO `test_table` (id, code, start_date) VALUES (1,\'EURUSD\',\'2014.01.01 00:00:01\');";
Query = Query + "INSERT INTO `test_table` (id, code, start_date) VALUES (2,\'EURJPY\',\'2014.01.02 00:02:00\');";
Query = Query + "INSERT INTO `test_table` (id, code, start_date) VALUES (3,\'USDJPY\',\'2014.01.03 03:00:00\');";
      

多语句错误:您的 SQL 语法有误;请查看 与您的 MySQL 服务器版本相对应的手册,了解附近使用的正确语法 ...



 
它支持修改 sql 命令吗?
 
Yu Zhang:

多重插入出错。

多语句错误:您的 SQL 语法有误;请查看与您的 MySQL 服务器版本相对应的手册,了解附近使用的正确语法 ...



确保在打开数据库连接时设置了多语句客户端标志。

int ClientFlag = CLIENT_MULTI_STATEMENTS; // 设置多语句标志
int DB; 

DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); // 连接到数据库