有关存储过程的一个奇怪的问题?(50分)

  • 主题发起人 主题发起人 qhchen77
  • 开始时间 开始时间
Q

qhchen77

Unregistered / Unconfirmed
GUEST, unregistred user!
我得系统采用d6+win2000+sql server2000+ado开发的一个三层结构。
其中用到了数据库中的一个存储过程。存储过程需要传入一个参数。
在服务器端,采用adostoreprocedure和datasetprovider.
在客户端,采用clientdataset.设置clientdataset的参数值。
然后运行如下程序:
clientdataset1.Close ;
clientdataset1.Params.ParamByName('@y_int').Value :=i;
clientdataset1.open;

很奇怪的是,这段程序第一次调用是正确无误的,
如果再调用,就会出现错误提示
说参数‘@y_int’没找到。
这是为什么?
 
‘@y_int’参数的属性类型是否正确
在不就把现有的删除,从新建立此关联
 
clientdataset1.Close ;
clientdataset1.FetchParams;
clientdataset1.Params.ParamByName('@y_int').Value :=i;
clientdataset1.open;
 
即然三层,为什么不定义接口函数调用存储过程,给你个例子参考。
如何在应用层定义接口,调用存储过程。
(1)在edit/Add to interfalce
function TRemDataModal.Callproc(const procname: WideString;
paranum: OleVariant): OleVariant;
var //定义接口
i:integer;
begin
with ADOStoredProc1 do
begin
ProcedureName:=procname;
Parameters.Refresh;
for i:=1 to Parameters.Count-1 do
Parameters.Value:=paranum[i-1];
ExecProc;
end;
(2)客户端:调用传递参数就行了。
frmdm.SocketConnection1.open;
frmdm.SocketConnection1.AppServer.callproc('out',vararrayof([''+mobilenum+'',0,sysdate,content]));
frmdm.SocketConnection1.close;
 
在每次调用存储过程以前加一句
clientdataset1.Params.Clear
 
问题解决了。
我的存储过程中有4个输出参数,一个输入参数。
而我只对输入参数赋值。没有理会输出参数。出现了上述问题。
后来,保留了输入参数,将输出参数都取消了,就好了。

不过我还是有点不明白,按照上述情况,
为什么第一次运行时没事,都后来就会跳出问题。
 
我遇到与你一样的问题。我在clientdataset1.Params.ParamByName('@y_int').Value :=i;
前面加了一句:
clientdataset1.Params.refresh;
就可以了。
 
参数属性里面对应的参数初值设为null
 
后退
顶部