Cursor not returned from Query在已经有set nocount on之后可能的解决办法

问题:

clientDataSet.commandText := 'exec save_postbill_scanOutLibA'
open;//<-这一步报Cursor not returned from Query

存储过程:

alter procedure save_postbill_scanOutLibA
begin
	set nocount on;
	declare @errorCode int
	...
	exec verifier_dispatchList
	...
	select @errorCode errorCode
end
alter procedure verifier_dispatchList
begin
	set nocount on;
	...
end

经过减半注释查找问题,最终发现如果注释掉verifier_dispatchList的两个update语句就能成功在delphi中使用fieldbyname(‘errorCode’)获得数据,但如果不注释就会报Cursor not returned from Query

网上的解决办法统一是在存储过程开头添加set nocount on,但是这一句我是有的,所以并不是这个问题。而且这两条update也没有任何特殊,其前后也有其他update语句,该表在前面也有进行过update,不明白为何就这两条语句出问题

后来想到会不会是其他语句干扰,于是继续排查,发现如果不是注释那两条update,而是注释掉其中一个游标中的insert语句,也可以成功返回,这也太怪了吧
然后查看输出时发现消息中有“警告:聚合或其他set操作消除了null值”,心想会不会这个和nocount有类似的效果,于是查了一下消除这个警告的方式是set ansi_warnings off,于是在存储过程开头加了这么一句,果然就能成功返回数据了!
然后看了一下引起警告的语句,是select sum(iquantity) as iquantity into #temp form #temp1 group by id
感觉和update和insert都没有关系啊,而且如果注释了那两条update语句,仍然会有警告,但也能正常返回数据,搞不懂究竟是什么导致的问题
但是总之问题已经解决了,就懒得找究竟为什么会引起Cursor not returned from Query错误了。就是在开头再添加一个set ansi_warnings off消除警告即可


今天又出现了这个问题,是在原过程能正常运行的情况下,修改之后的代码报该问题
于是从原代码一点一点向出错代码改动,最终发现如果添加了print语句就会报该问题,将print语句注释后就不再出现。

目前看来我认为这个应该是最终答案了,在使用clientDataSet.open时,不要再存储过程中添加print,或者在调试完毕后将print语句注释掉

今天又出现了这个问题,于是尝试将set ansi_warnings off添加上去,又可以了。目前看来两个都是必要操作。如果再出问题再看看怎么解决吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值