问题:
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添加上去,又可以了。目前看来两个都是必要操作。如果再出问题再看看怎么解决吧