如何从Visual FoxPro调用MariaDB存储过程并获取游标?
在Visual FoxPro中通过MariaDB/MySQL存储过程获取游标
问题场景
我在MariaDB中创建了如下存储过程:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test1`(var1 varchar(100)) BEGIN select * from ttype where kode=var1; END
尝试在Visual FoxPro(VFP)中调用该存储过程获取游标时失败:
Sqlexec(kon,"call test1 ('ABC')","test") --> 无法运行
但直接执行普通SELECT语句却能正常生成游标:
sqlexec(kon,"select * from ttype where kode='ABC'","test")
解决方案
原因分析
MySQL/MariaDB执行存储过程时,默认会返回一个额外的「执行状态」结果集(比如受影响行数),VFP的SQLEXEC函数默认只会处理第一个结果集,而这个结果集是空的,导致无法生成目标游标。
方法1:修改存储过程,抑制额外结果集
在存储过程开头添加SET @@SESSION.NO_COUNT = 1;,关闭额外结果集的返回,只保留SELECT查询的结果:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test1`(var1 varchar(100)) BEGIN SET @@SESSION.NO_COUNT = 1; select * from ttype where kode=var1; END
修改后重新执行VFP中的调用语句即可正常生成test游标。
方法2:在VFP中手动处理多结果集
如果无法修改存储过程,可以通过多次调用SQLEXEC来获取目标结果集:
* 先执行存储过程,获取并忽略第一个空结果集 lnResult = SQLEXEC(kon, "call test1 ('ABC')") * 获取第二个结果集(即SELECT的查询结果)到游标test lnResult = SQLEXEC(kon, "", "test")
执行完成后,test游标即可正常使用,比如用BROWSE命令查看数据。
方法3:调整连接属性
在建立数据库连接后,设置事务模式为手动提交,避免自动提交产生的额外结果:
DBSetProp(kon, "Connection", "Transactions", 2)
之后再执行存储过程调用,也能避免结果集冲突问题。
内容的提问来源于stack exchange,提问作者Nugroho Moristianto
相关产品推荐
相关产品推荐

