请教一个调用SQLSERVER2000D的存储过程不能正确返回输出参数的问题(50分)

  • 主题发起人 主题发起人 水印
  • 开始时间 开始时间

水印

Unregistered / Unconfirmed
GUEST, unregistred user!
请教:最近,我在用midas组件开发C/S程序,数据库为SQL SERVER2000,当客户端采用
带返回参数的方式调用存储过程时,无法返回存储过程返回的结果参数,客户端的参数
是动态产生的(DataSet为TClientDataSet,用TDcomconnect连接,Server程序
采用TDataBase,TQuery,TDataSetProvider等),如:
DataSet.Close;
// ClearDatasetParams(DataSet);

DataSet.Params.AddParam(Tparam.Create(DataSet.Params));
DataSet.Params[0].Name:='old_pwd';
DataSet.Params[0].DataType:=ftstring;
DataSet.Params[0].ParamType:= ptinput;
DataSet.Params.AddParam(Tparam.Create(DataSet.Params));
DataSet.Params[1].Name:='new_pwd';
DataSet.Params[1].DataType:=ftstring;
DataSet.Params[1].ParamType:= ptinput;
DataSet.Params.AddParam(Tparam.Create(DataSet.Params));
DataSet.Params[2].Name:='user_name';
DataSet.Params[2].DataType:=ftstring;
DataSet.Params[2].ParamType:= ptinput;
DataSet.Params.AddParam(Tparam.Create(DataSet.Params));
DataSet.Params[3].Name:='returns';
DataSet.Params[3].DataType:=ftinteger;
DataSet.Params[3].ParamType:= ptinputoutput;
DataSet.CommandText:='execute coalstation.modify_password :old_pwd,'+
':new_pwd,:user_name,:returns output' ;
DataSet.Params.ParamByName('old_pwd').asstring:=trim(RzEdit2.Text);
DataSet.Params.ParamByName('new_pwd').asstring:=trim(RzEdit1.text);
DataSet.Params.ParamByName('user_name').asstring:=trim(RzEdit1.text);

DataSet.Params.ParamByName('returns').asinteger:=-1000;
DataSet.Execute;
except
case Dataset.Params.ParamByName('returns').asinteger of
-1200:begin
messagebox(handle,'此用户不存在!,不能保存','警告',mb_ok);
end;
-1100:begin
messagebox(handle,'处理数据时出错!','警告',mb_ok);
end;
end;

result:=-1;
exit;
end;
 
等待中。。。。
 
等待中。。。。
 
等待中。。。。[:(]
 
等待中。。。。[:(]
 
等待中。。。。[:(]
 
你这个不是存储过程啊,你的clientdataset和远程服务器中的Tstoreproc相连了吗?
 
这是客户端的代码,SQLSERVER上的存储过程经验证是正确的,而且,服务程序把
TQuery换为adoquery后,此问题解决,但用adoquery后,输入参数一旦为中文,存储过程
就无法正确插入中文字段
 
把TQuery换为Tstoreproc也试过,问题同样,
 
哦,刚才看错了
如果你用exec这种方法调用存储过程的话就不要再动态的创建参数列表了呀
DataSet.CommandText:='execute coalstation.modify_password :old_pwd,'+
':new_pwd,:user_name,:returns output' ;
dataset.refresh;//记不住是不是这样了,要不就是dataset.paramtems.refresh之类的东东
DataSet.Params.ParamByName('old_pwd').asstring:=trim(RzEdit2.Text);
DataSet.Params.ParamByName('new_pwd').asstring:=trim(RzEdit1.text);
DataSet.Params.ParamByName('user_name').asstring:=trim(RzEdit1.text);

DataSet.Params.ParamByName('returns').asinteger:=-1000;
DataSet.Execute;
 
无效,我估计是服务程序中TQuery的问题,因为用Tadoquery就无此问题,但用Tadoquery
又有其他毛病
 
我以为你用的就是ado
用bde的话用存储过程(动态创建)确实挺讨厌的,不过是可以的,因为我用过
现在在网吧,不能试,但是觉得
DataSet.Params.AddParam(Tparam.Create(DataSet.Params));
..........
应该放到
DataSet.CommandText:='execute coalstation.modify_password :old_pwd,'+
':new_pwd,:user_name,:returns output' ;
的后面
 
试过,无效,连Tparam.create()改为dataset.params.createparam()都用过,不行。[:(]
 
因为不清楚clientdataset的动态用法,所以可以
用一个笨一点的方法,用一个过程将这些参数传到远程模块或MTS中去
在远程模块中用tquery来执行(Tquery肯定是可以的)
 
客户端可以正确把参数传到服务程序中,且SQLSERVER2000上的存储过程也能
 
客户端可正确传参数到服务器端,且SQLSERVER2000的存储过程也可正确被执行,但就是
RETURNS返回参数不对,不能正确回传
 
如果用exec这种存储过程的调用方法
好像return参数并不需要赋初值吧,会不会是这个原因
DataSet.Params.ParamByName('returns').asinteger:=-1000;//这一句注释掉
如果也不行,就不知道了
 
试过,确实不行,真没办法[:(]
 
可以用这种方式处理参数,这样ADO也可以处理中文.
sql:='exec [取字符串个数] [%s] ';
sql:=format(sql,['测试字符串']);
ClientDataSet1.CommandText :=sql;
 
感谢TESTNET,我会试试您的方法,另外,您知道关于那个返回参数的问题吗?[:)]
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
955
SUNSTONE的Delphi笔记
S
D
回复
0
查看
868
DelphiTeacher的专栏
D
后退
顶部