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中执行都是完全正常的。
现象:在通过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中执行都是完全正常的。