第一次用存储过程,真是不适应。一个简单的例子,大家看一下,错误在哪里。(sql server服务器端建立的存储过程)
CREATE PROCEDURE dbo.result
@mult1 int,
@mult2 int,
@result int output
as
set @result=@mult1*@mult2
GO
(应用程序)
procedure TForm1.Button2Click(Sender: TObject);
var
  p1,p2,p3:Tparam;
begin
  storedproc1.StoredProcName:='Result';
  storedproc1.Close;
  storedproc1.Params.Clear;
  p1:=Tparam.Create(storedproc1.Params,ptinput);
  p2:=Tparam.Create(storedproc1.Params,ptinput);
  p3:=Tparam.Create(storedproc1.Params,ptoutput);
  try
    storedproc1.Params[0].name:='mult1';
    storedproc1.Params[1].Name:='mult2';
    storedproc1.Params[2].Name:='@result';
    storedproc1.ParamByName('mult1').AsInteger:=3;
    storedproc1.ParamByName('mult2').AsInteger:=2;
    StoredProc1.prepared:=true;
    StoredProc1.open;
    //storedproc1.ExecProc;
    edit1.Text:=inttostr(storedproc1.ParamByName('@result').AsInteger);
  finally
    p1.Free;
    p2.Free;
    p3.Free;
  end;
end;出错提示是:field of '@result' is unknown type.

解决方案 »

  1.   

    procedure TForm1.Button2Click(Sender: TObject);
    var
      p1,p2,p3:Tparam;
    begin
      storedproc1.StoredProcName:='Result';
      storedproc1.Close;
      storedproc1.Params.refresh;
      try
        storedproc1.ParamByName('@mult1').AsInteger:=3;
        storedproc1.ParamByName('@mult2').AsInteger:=2;
        StoredProc1.prepared:=true;
        storedproc1.ExecProc;
        edit1.Text:=inttostr(storedproc1.ParamByName('@result').AsInteger);
      finally
      end;
    end;
      

  2.   

    storedproc1.StoredProcName:='Result;1';
    这个你最好静态指定
      

  3.   

    你的result是否溢出了
    应该定义成浮点型
      

  4.   

    还是不行,不过不是那个错误,因为在查询分析器上是可以用的。那就是应用程序连接的问题了。去问老师了,原来的登陆模式是windows登陆模式,后重装改成了sql server的登陆模式。不过,还是出现问题:当TstroedProc的各项设置都好之后,想置active属性为true,又出现了问题,错误提示是:没有提供需要的指示器变量。哪位高手知道啊。第一次用存储过程,真是难。
      

  5.   

    奇怪了
    我用这个SP从来不会出错
    可惜我装SQLSERVER不能给你试了
    看看别人是不是能试试
      

  6.   

    我用的是ADO,如下。一切正常。  ADOStoredProc1.Close;
      ADOStoredProc1.ProcedureName := 'result;1';  ADOStoredProc1.Parameters[1].Value := 1;
      ADOStoredProc1.Parameters[2].Value :=3;
      ADOStoredProc1.prepared:=true;
      ADOStoredProc1.ExecProc;
      Edit1.Text := VarToStr(ADOStoredProc1.Parameters.ParamByName('@result').Value);