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)
查了一些资料,发现没有错.真不知道错在哪里.不知道哪位神仙能解决我的问题
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)
查了一些资料,发现没有错.真不知道错在哪里.不知道哪位神仙能解决我的问题
ADOStoredProc1.ProcedureName:='CheckUser';
ADOStoredProc1.Parameters.ParamByName('@UCode').Value := edit1.Text;
//move down
ADOStoredProc1.Prepared;
ADOStoredProc1.ExecProc;
edit2.Text:=Inttostr(ADOStoredProc1.Parameters.ParamByName('@RCount').Value);
先执行存储过程后才返回值呀!
如果没错的话,你打开ADOStoredProc1的Parameters属性看,参数@UCode根本就没有定义他的类型和长度,
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类型,当然放在执行之后才能引了
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); //得到结果
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;
ADOStoredProc1.Parameters.ParamByName('@UCode').Value := edit1.Text;
ADOStoredProc1.Parameters.AddParameter; //必须有
ADOStoredProc1.Parameters.ParamByName('@RCode').Value := 0;
跟本就不需要动态创建参数,存储过程里已经建好了,只不过必须每个参数要赋值再调用!
程序应如下:(带*的为必须项)
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测试通过