You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:05:38