SQL Server 存储过程:
Create PROCEDURE CheckUser
@UCode varchar(100),@RCount Int OUTPUT
AS
Select @RCount=Count(*) from T_Users Where UserCode=@UCodeDelphi 的调用过程:
ADOStoredProc1.Close;
ADOStoredProc1.ProcedureName:='CheckUser';
ADOStoredProc1.Parameters.ParamByName('@UCode').Value := edit1.Text;
edit2.Text:=Inttostr(ADOStoredProc1.Parameters.ParamByName('@RCount').Value);
ADOStoredProc1.Prepared;
ADOStoredProc1.ExecProc;结果运行错误,系统提示:存储过程参数 '@UCode' Not Found ,用'UCode'也一样,
使用ADOStoredProc1.Parameters[1]......结果提示 list index out of bounds(1)
查了一些资料,发现没有错.真不知道错在哪里.不知道哪位神仙能解决我的问题

解决方案 »

  1.   

    存储过程的设计应该没有问题,可能是ADOStoredProc调用方式错误。
      

  2.   

    @UCode varchar(100) OUTPUT,@RCount Int OUTPUT  把@UCode也声明成OUTPUT看看
      

  3.   

    ADOStoredProc1.Close;
    ADOStoredProc1.ProcedureName:='CheckUser';
    ADOStoredProc1.Parameters.ParamByName('@UCode').Value := edit1.Text;
    //move down
    ADOStoredProc1.Prepared;
    ADOStoredProc1.ExecProc;
    edit2.Text:=Inttostr(ADOStoredProc1.Parameters.ParamByName('@RCount').Value);
    先执行存储过程后才返回值呀!
      

  4.   

    我认为都不是以上的问题,这样的情况我也碰过,
    如果没错的话,你打开ADOStoredProc1的Parameters属性看,参数@UCode根本就没有定义他的类型和长度,
      

  5.   

    Delphi 的调用过程:
    ADOStoredProc1.Close;ADOStoredProc1.ProcedureName:='CheckUser';
    ADOStoredProc1.Refresh;   //即然你重新赋了ProcedureName,就一定要Refresh一下重新获取参数列表ADOStoredProc1.Parameters.ParamByName('@UCode').Value := edit1.Text;
    ADOStoredProc1.Prepared;
    ADOStoredProc1.ExecProc;edit2.Text:=Inttostr(ADOStoredProc1.Parameters.ParamByName('@RCount').Value);
    //既然都是Output类型,当然放在执行之后才能引了
      

  6.   

    ADOStoredProc1.Close;
    ADOStoredProc1.ProcedureName:='CheckUser';
    ADOStoredProc1.Parameters.Refresh;
    ADOStoredProc1.Parameters.ParamByName('@UCode').Value := edit1.Text;
    ADOStoredProc1.Parameters.ParamByName('@RCount').Value:=0;   //一定要赋个初值!!!//ADOStoredProc1.Prepared;  不需要这句
    ADOStoredProc1.ExecProc;
    edit2.Text:=Inttostr(ADOStoredProc1.Parameters.ParamByName('@RCount').Value);  //得到结果
      

  7.   

    ADOStoredProc1.Close;
    ADOStoredProc1.ProcedureName:='CheckUser';
    ADOStoredProc1.Prepared:=true; --加在这里就没有问题了
    ADOStoredProc1.Parameters.ParamByName('@UCode').Value := edit1.Text;
    ADOStoredProc1.Parameters.ParamByName('@RCount').Value:=0; 
    edit2.Text:=Inttostr(ADOStoredProc1.Parameters.ParamByName('@RCount').Value);
    ADOStoredProc1.Prepared:=false;
      

  8.   

    忘记动态创建参数了!ADOStoredProc1.Parameters.AddParameter;   //必须有
    ADOStoredProc1.Parameters.ParamByName('@UCode').Value := edit1.Text;
    ADOStoredProc1.Parameters.AddParameter;   //必须有
    ADOStoredProc1.Parameters.ParamByName('@RCode').Value := 0;
      

  9.   

    ADOStoredProc1.Parameters.Refresh; 就是刷新 'CheckUser'这个存储过程的参数
    跟本就不需要动态创建参数,存储过程里已经建好了,只不过必须每个参数要赋值再调用!
      

  10.   

    我没有你的数据库,所以假设存储过程正确
    程序应如下:(带*的为必须项) 
      with ADOStoredProc1 do
      Begin
        try
          close;
          ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=用户    
          名;Initial Catalog=数据库名称;Data Source=计算机名称';//连接数据库*
          ProcedureName:='CheckUser';
          Parameters.Add;//创建参数*
          Parameters.Items[0].Name:='@UCode';//设置参数名称*
          Parameters.Add;//创建参数*
          Parameters.Items[1].Name:='@RCount';//设置参数名称*
          Parameters.Items[1].Direction:=pdOutput;//设置为输出参数*
          Parameters.Items[1].Value:=0;//初始化输出参数*      
          Parameters.ParamByName('@UCode').Value := edit1.Text;
          Prepared;
          ExecProc;
          edit2.Text:=Inttostr(Parameters.ParamByName('@RCount').Value);
        finally
            Parameters.Clear;//清空参数
        end;
      end;  以上在win2k+delphi6测试通过