导航:
论坛 -> 数据库专区
斑竹:liumazi,waterstone
作者:
2004/5/10 12:42:22
标题:
加入我的收藏
楼主:
我在TSQLStoredProc中调用一个升工资的存储过程,做了十几天,做不出来。 我的代码如下,没有参数了很正常,有常数就马上不行了。 主要表现为参数加不上。出现错误如下: list index out of bounds(0); 以下是我的代码: =========================================== procedure TForm1.Button1Click(Sender: TObject); //var //P1, P2: TParam; begin with Datamodule2.SQLStoredProc1 do begin params.Clear; StoredProcName := 'RaiseSalary'; params.Add; params[0].Name:='eid'; parambyname('eid').AsString:='a001'; //params.EndUpdate; execproc; { P1 := TParam.Create(Params, ptInput); P2 := TParam.Create(Params, ptInput); try Params[0].Name := '@EID'; Params[1].Name := '@RPercent '; //ParamByname('EID').AsString :='A00001'; Params[0].AsString:='A00001'; ExecProc; finally P1.Free; P2.Free; end; } end; end; ========================== 我试过好多种方法,也包括手工增加,都不行。 代码上屏闭部份都是我试过的方法
----------------------------------------------
-
作者:
2004/5/10 12:45:49
1楼:
补: 我用的数据库是sql server2000
----------------------------------------------
-
作者:
2004/5/10 14:12:05
2楼:
SQLStoredProc1 控件的变量是根据它所链接的Procedure来的 变量名和变量个数不能修改的!!
----------------------------------------------
-
作者:
2004/5/10 18:48:25
3楼:
那这样在程序中如何输入变量呀,又如何取得返回的变量呀?我的procedure如下: 请帮我看一下可不可以? =========================================================== CREATE PROCEDURE dbo.RaiseSalary @EID nvarchar(10) ='a00001', @RPercent float=0.5 AS begin print @EID Update BaseData Set YLPrice =YLPrice*(1+@RPercent) Where YID=@EID end GO
----------------------------------------------
-
作者:
2004/5/10 20:27:45
4楼:
var p1,p2:TParam; begin StoredProc1.Params.Clear; p1 := TParam.Create(nil); p2 := TParam.Create(nil); try p1.Name := '@eid'; p1.DataType := ftString; p1.ParamType := ptInput; StoredProc1.Params.AddParam(p1); //关键:加入参数对象 p2.Name := '@RPercent'; p2.DataType := ftFloat; p2.ParamType := ptInput; StoredProc1.Params.AddParam(p2); ////关键:加入参数对象 StoredProc1.ParamByName('@eid').AsString := 'a00001'; StoredProc1.ParamByName('@rpercent').AsString := '0.5'; StoredProc1.ExecProc; finally p1.Free; p2.Free; end;
----------------------------------------------
-
作者:
2004/5/10 22:43:12
5楼:
还是一样呀!真没办法。
此帖子包含附件: 大小: 21.9K
----------------------------------------------
-
作者:
2004/5/11 8:27:07
6楼:
唉,你在设计时即将StoredProc连到对应的存储过程,然后设置好参数,再试试。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2004/5/11 9:02:05
7楼:
对不起,“设计时即将StoredProc连到对应的存储过程”是什么意思,是设置Active为true吗?我试了,还是出错,说是没有返回结果集。我的存储过程本身不返回结果集的呀。我也试过在设计时设置好参数,可一样不行呀而且结果和我的上一贴所说的一模一样。(list index out of bounds(0))
----------------------------------------------
-
作者:
2004/5/11 9:27:08
8楼:
with ADOQUERY1 do//我没空帮你看你那些代码,给你个列子,自己对照一下! begin close; sql.Clear; sql.Text:='execute getdata5 :b,:c'; //execute 存储过程名 :变量1 ,:变量2 Params[0].Value:=datetostr(datetimepicker1.date);//传递参数 Params[1].Value:=datetostr(datetimepicker2.date); open; first; end;
----------------------------------------------
作者:
2004/5/11 10:27:52
9楼:
太感谢tutao了,用TSqlquery真的可以实现,只可惜不能用TStoredProc了。 还有,如何从存储过程中返加结果,能不能再给个例子。 CREATE PROCEDURE [dbo].[test] @first int, @sec int, @ret int Output AS set @ret=@first+@sec 上面这个最简单的存储过程,我却得不到结果,能不能再帮忙看一下,先谢了。
----------------------------------------------
-
作者:
jfyc (酷光头)
★☆☆☆☆
-
盒子活跃会员
2004/5/11 10:39:38
10楼:
declare @a int exec test @first=1,@sec=2,@ret=@a output select @a -------- delphi中,把@ret给你自己的变量就行了.
----------------------------------------------
-
作者:
2004/5/11 12:49:59
11楼:
以下以SQL Server为例: 在窗体上放一个ADOStoredProc控件,设置好其Connection属性(或直接设置其ConnectionString),选择ProcedureName属性,从其中选择你要连的存储过程; 运行时设置参数,打开或执行即可: 对返回记录集的,用以下方法: ADOStoredProc1.Close; ADOStoredProc1.Parameters.ParamByName('@CategoryName').Value := DBLookupComboBox1.Text; ADOStoredProc1.Parameters.ParamByName('@OrdYear').Value := Edit1.Text; ADOStoredProc1.Open; 将DataSource指向ADOStoredProc1,再将DBGrid连到DataSource,即可看到结果集; 对返回若干个值的,用以下方法: if ADOStoredProc1.Active then ADOStoredProc1.Close; ADOStoredProc1.Parameters.ParamByName('@first').Value := 你想传入的值; ADOStoredProc1.Parameters.ParamByName('@sec').Value := 你想传入的值; ADOStoredProc1.ExecProc; 你要取返回值的变量 := ADOStoredProc1.Parameters.ParamByName('@ret').Value;
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2004/5/11 18:17:10
12楼:
看你的提示是参数没有加上去,你引用时才会出现此错误,我给你贴的那段代码是经过delph7+sqlserver 2000验证过; 给我一个电话号码,我与你电话联系
----------------------------------------------
-
作者:
2004/5/12 9:37:29
13楼:
经典,飞过。
----------------------------------------------
我真的很菜啊。
作者:
2004/5/13 12:05:29
14楼:
对不起各位兄弟,因为前二天我的delphibox网不知为什么上不了,所有没能看各位的贴子。 谢谢tanger兄弟的热心帮助,我的问题还是没能最终圆满的解决。 我引用了tanger兄弟的代码,可是还一样的不行。 如果tanger兄弟有看贴的话,能不能再帮我查一下。 with Datamodule2.sqlstoreProc1 do begin StoredProcName := 'RaiseSalary'; params.Clear; p1:=TParam.Create(nil); p2:=Tparam.Create(nil); try p1.Name:='@EID'; p1.DataType:=ftString; p1.ParamType:=ptInput; Params.AddParam(p1); p2.Name:='@RPercent'; p2.DataType:=ftFloat; p2.ParamType:=ptInput; params.AddParam(p2); paramByname('@EID').AsString:='a00001'; paramByname('@RPercent').AsFloat:=0.5; //应该不是参数没加上去,否则paramByname('@eid')就会出'找不到'@eid'的错误了。 Execproc; finally p1.Free; p2.Free; end; //让您破费打电话,太不好意思了,我打给您吧。 我的电话:0596-2273153 QQ:25559749
----------------------------------------------
-
作者:
2004/5/14 9:02:56
15楼:
网管能不能帮我转到《delphi技术》呀
----------------------------------------------
-
作者:
xacz (带头大哥)
★☆☆☆☆
-
盒子活跃会员
2004/5/14 12:15:01
16楼:
不用这么复杂吧?为什么要给RaiseSalary动态创建参数呢?奇怪。 iamdream 写的很好啊
----------------------------------------------
-
作者:
2004/5/14 13:27:33
17楼:
iamdream写的不是我用的TSqlStoreProc呀
----------------------------------------------
-
作者:
xacz (带头大哥)
★☆☆☆☆
-
盒子活跃会员
2004/5/14 14:04:21
18楼:
DELPHI里proc控件使用方法都差不多的呀,而且都会自动关联参数的,不知道你为何这样写 :(
----------------------------------------------
-