本人delphi新手,在使用TADOStoredProc组件时,在执行到sp.Parameters.ParamByName('@TaskCount').Value := -1时提示@TaskCount not found ,怎么回事?我的存储过程中是有@TaskCount参数的
代码如下: 
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls;type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOStoredProc1: TADOStoredProc;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
  procedure TForm1.FormCreate(Sender: TObject);
begin
  adostoredproc1.Parameters.Refresh;
end;procedure TForm1.FormShow(Sender: TObject);
var
  sp: TADOStoredProc;
begin
  sp := TADOStoredProc.Create(Self);
  sp.Connection := ADOConnection1;  sp.CommandTimeout := 0;
  sp.ProcedureName := '[dbo].[up_build_switchtask]';  sp.Parameters.Refresh;  sp.Parameters.ParamByName('@TaskCount').Value := -1;  sp.ExecProc;
end;end.

解决方案 »

  1.   

    //....
    //先加下面一句。
    sp.Parameters.CreateParameter('@TaskCount',ftInteger,pdOutput,0,null);
    sp.Parameters.ParamByName('@TaskCount').Value := -1;
    sp.ExecProc;
      

  2.   

    呵,错了,应是输入参数。改成pdInput
    sp.Parameters.CreateParameter('@TaskCount',ftInteger,pdInput,0,null);
      

  3.   

    用 ADOStoredProc1.Parameters.Refresh对参数进行刷新不可以代替动态建立参数吗
      

  4.   

    用 ADOStoredProc1.Parameters.Refresh也可以对参数进行刷新而不动态建立参数吧,我在一个技术文章中看到的这种用法:
    在Delphi中Ado系列控件使用xxxxx.Parameters.Refresh,可以获得存储过程的Return值以TADOStoredProc为例  ADOStoredProc1.Connection := 'xxxx';  ADOStoredProc1.ProcedureName := 'XXXX';
      ADOStoredProc1.Parameters.Refresh;   //刷新存储过程的参数列表 //参数赋值 ADOStoredProc1.ExecProc; ADOStoredProc1.Parameters[0].Value;  //就是Return的返回值我是不是哪里用的不对,在执行到Refresh时parameters里并没有出现存储过程的参数
      

  5.   

    问题解决了,两种方法理论上都可以,我原来是在win7调试有这个异常,但在windows sever 2008下就没有问题,应该是操作系统兼容性的问题。