出错信息:存储过程test需要参数;@id但未有提供参数??? +存储过程返回结果null无法把varaint转换为string。(100分)

  • 主题发起人 主题发起人 tongwenhuan2003
  • 开始时间 开始时间
T

tongwenhuan2003

Unregistered / Unconfirmed
GUEST, unregistred user!
在sql server 中创建并执行.<br>create procedure test<br> &nbsp;@id varchar(10) output<br>as<br>begin<br> &nbsp;set @id = 'agc'<br>end<br>procedure TForm2.Button4Click(Sender: TObject);<br>var iProc:String;<br>begin<br> &nbsp;//ts:=cdsCustomer.AppServer.GetSum_Proc;<br> &nbsp;ADOStoredProc1.Close;<br> &nbsp;ADOStoredProc1.ProcedureName:='test;1';<br> &nbsp;ADOStoredProc1.Parameters.Refresh;<br> &nbsp;ADOStoredProc1.ExecProc;<br> &nbsp;iProc:= ADOStoredProc1.Parameters.ParamByName('@id').Value;<br> &nbsp;ListBox1.Items.Add(iProc);<br>end;<br>出错信息:过程test需要参数'@id',但未有提供参数<br><br>是不是在调用时候还有创建@id这个?<br>不知道怎么解决,急!!! &nbsp;<br>问题可以解决,但是还未找到错误原因。<br><br>来自:52free, 时间:2006-10-27 15:27:00, ID:3607964<br>这个问题好像讨论了好几天了,其实你在查询分析器里能实现的在delphi里一样可以实现<br>他也是一个SQL,这个我好像提示过,但似乎没人去试试<br><br> &nbsp;AdoQuery1.SQL.Clear;<br> &nbsp;AdoQuery1.SQL.Add('Exec Test :@ID output');<br> &nbsp;AdoQuery1.ExecSQL;<br> &nbsp;Caption := AdoQuery1.Parameters.ParamByName('@ID').value<br><br>就这么简单,我用delphi很多年都没用过ADOStoredProc &nbsp;<br><br>根据你提供的方法可以得到值。<br><br>来自:hongxing_dl, 时间:2006-10-27 15:34:23, ID:3607977<br>那你将它定义为函数吧:<br>create function test()<br> &nbsp;returns varchar(10)<br>as<br>begin<br> &nbsp;return ('agc');<br>end<br><br>to hongxing_dl 你的意思是把sql server 中的存储过程改为函数吗,有的不明白!
 
to sefeng1982<br>非常感谢你的指点,我一定尝试下。也谢谢大家。<br>祝大家工作学习一切都好吧。
 
是的,定义成自定义的函数就如我上面写的那样
 
需要在TADOStoredProc组件的Parameters里定义一个参数:@id,用以传回存储过程的输出值<br>如下:<br>procedure TForm2.Button4Click(Sender: TObject);<br>var iProc:String;<br>begin<br> &nbsp;//ts:=cdsCustomer.AppServer.GetSum_Proc;<br> &nbsp;ADOStoredProc1.Close;<br> &nbsp;ADOStoredProc1.ProcedureName:='test;1';<br> &nbsp;ADOStoredProc1.Parameters[0].Name := '@id';<br> &nbsp;ADOStoredProc1.Parameters[0].Direction := pdOutput;<br> &nbsp;ADOStoredProc1.Parameters[0].DataType := ftString;<br> &nbsp;ADOStoredProc1.ExecProc;<br> &nbsp;iProc:= ADOStoredProc1.Parameters.ParamByName('@id').Value;<br> &nbsp;ListBox1.Items.Add(iProc);<br>end;
 
还有个问题来求教[:)][:(]<br>MIDAS 三层中遇到错误:存储过程返回结果null无法把varaint转换为string。<br>CREATE PROCEDURE get_income<br>@icount int OUTPUT<br>AS <br>begin <br> <br>select icount=sum(income) from gjp<br><br>end <br><br><br>GO<br>上面的是sql server中的数据库,本想返回多值,因为一个都有问题,暂这样设计<br>function Tdb121.GetIncome: OleVariant;<br>var iProc:String;<br>begin<br> &nbsp;ADOQuery2.SQL.Clear;<br> &nbsp;ADOQuery2.SQL.Add('Exec get_income :@ID output');<br> &nbsp;ADOQuery2.ExecSQL;<br> &nbsp;iProc := ADOQuery2.Parameters.ParamByName('@ID').value;<br><br> &nbsp;// 建立一个变量数组给函数返回变量Result。<br> &nbsp; &nbsp;Result := VarArrayCreate([0, 1], varOleStr);<br> &nbsp; &nbsp; &nbsp;Result[0] := iProc;<br> &nbsp; &nbsp; // Result[1] := iProc2;<br>end;<br>上面的写在中间层中。<br>procedure TForm2.Button4Click(Sender: TObject);<br>var<br> &nbsp;I: Integer;<br> &nbsp;midret: OleVariant;<br>begin<br> &nbsp; &nbsp;// ListBox1.Items.Add(iProc);<br> &nbsp; // 连上应用程序服务器<br> &nbsp;cdsCustomer.Connected := True;<br> &nbsp;midret := cdsCustomer.AppServer.GetIncome;<br><br> &nbsp;if VarIsArray(midret) then<br> &nbsp; &nbsp;for I := 0 to VarArrayHighBound(midret, 1) do<br> &nbsp; &nbsp; &nbsp;self.ListBox1.Items.Add(midret);<br>end;<br>上面的写在客户端调用层上。<br><br>出现上面的错误。我无所适从。中间层不知道怎么调试,根本进不去。向大虾们指点了。。。。
 
iProc := ADOQuery2.Parameters.ParamByName('@ID').AsString;
 
后退
顶部