通过ADO调用存储过程返回结果集,错误何在? (100分)

  • 主题发起人 主题发起人 aladdin
  • 开始时间 开始时间
A

aladdin

Unregistered / Unconfirmed
GUEST, unregistred user!
环境:Delphi 6 UP2 + MSSQL 2000 + ADO 2.6+

现象:在通过ADO调用MSSQL中的需要通过结果集返回数据的存储过程时,
有些情况下会出现“Item cannot be found in the collection corresponding
to the requested name or ordinal”的错误。

简化后的代码:
(存储过程)
CREATE PROCEDURE GetNextKeyValue(@key_name varchar(30)) AS
begin
....................(1)
declare @key_value int

set @key_value=(select KeyValue from sys_EntityKey
where rtrim(lower(KeyName))=rtrim(lower(@key_name)))

set @key_value=@key_value+1 ....................(2)
update sys_EntityKey set KeyValue=@key_value
where rtrim(lower(KeyName))=rtrim(lower(@key_name))
print 'test'

select @key_value ....................(3)
end
GO

(客户端代码)
procedure TForm1.Button1Click(Sender: TObject);
var
RS: _RecordSet;
begin
with aconnDB do
begin
RS := Execute('GetNextKeyValue '''+Edit1.Text+'''');
Edit2.Text := IntToStr(RS.Fields[0].Value);
end;
end;

跟踪发现,出错时RS: _RecordSet的Fields.Count=0。

在相同的调用代码情况下:

发现只要在(2)和(3)之间有任何代码,不论是否引用@key_value,是否进行查询,
哪怕只是调用print,都会出现相同的错误。而若没有,则正常。为什么?难道
有任何语句都会改变(3)的执行结果吗?

而且,后来发现若在(1)处增加SET NOCOUNT OFF,则无论如何均正常。为什么?
(我的真实代码是需要判断@@ROWCOUNT的,所以不能简单地关闭COUNT)有无COUNT,
除了帮助中说的少传信息会提高性能外,在其他方面还有些什么不同?

补充说明:在上述的任何情况下,用BDE来调用或在SQL Analyzer中执行都是完全正常的。
 
照你的过程来看,你不需要返回数据集,只要一个返回参数就行了,改一下吧。
 
通过out参数传递的方法我知道。这个例子是简化后的,在需要返回较多数据时,实际的存储过程不都可以换成用out参数的方式啊。
 
后退
顶部