DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: s_monkeys
今日帖子: 25
在线用户: 14
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 zzcaism (LionKing) ★☆☆☆☆ -
普通会员
2004/5/10 12:42:22
标题:
高手救我,十多天人没人能答 浏览:2378
加入我的收藏
楼主: 我在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;

==========================
我试过好多种方法,也包括手工增加,都不行。

代码上屏闭部份都是我试过的方法
----------------------------------------------
-
作者:
男 zzcaism (LionKing) ★☆☆☆☆ -
普通会员
2004/5/10 12:45:49
1楼: 补:
我用的数据库是sql server2000
----------------------------------------------
-
作者:
男 cyh9519 (智商65) ★☆☆☆☆ -
普通会员
2004/5/10 14:12:05
2楼: SQLStoredProc1 控件的变量是根据它所链接的Procedure来的
变量名和变量个数不能修改的!!
----------------------------------------------
-
作者:
男 zzcaism (LionKing) ★☆☆☆☆ -
普通会员
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


----------------------------------------------
-
作者:
男 tangren (tangren) ★☆☆☆☆ -
盒子活跃会员
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;
----------------------------------------------
-
作者:
男 zzcaism (LionKing) ★☆☆☆☆ -
普通会员
2004/5/10 22:43:12
5楼: 还是一样呀!真没办法。
此帖子包含附件:
JPEG 图像
大小:21.9K
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2004/5/11 8:27:07
6楼: 唉,你在设计时即将StoredProc连到对应的存储过程,然后设置好参数,再试试。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 zzcaism (LionKing) ★☆☆☆☆ -
普通会员
2004/5/11 9:02:05
7楼: 对不起,“设计时即将StoredProc连到对应的存储过程”是什么意思,是设置Active为true吗?我试了,还是出错,说是没有返回结果集。我的存储过程本身不返回结果集的呀。我也试过在设计时设置好参数,可一样不行呀而且结果和我的上一贴所说的一模一样。(list index out of bounds(0))
----------------------------------------------
-
作者:
男 sutao (炸蛋) ★☆☆☆☆ -
普通会员
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;

----------------------------------------------
作者:
男 zzcaism (LionKing) ★☆☆☆☆ -
普通会员
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给你自己的变量就行了.
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
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;

----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 tangren (tangren) ★☆☆☆☆ -
盒子活跃会员
2004/5/11 18:17:10
12楼: 看你的提示是参数没有加上去,你引用时才会出现此错误,我给你贴的那段代码是经过delph7+sqlserver 2000验证过;

给我一个电话号码,我与你电话联系
----------------------------------------------
-
作者:
男 jasonmao (jason) ★☆☆☆☆ -
普通会员
2004/5/12 9:37:29
13楼: 经典,飞过。
----------------------------------------------
我真的很菜啊。
作者:
男 zzcaism (LionKing) ★☆☆☆☆ -
普通会员
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
----------------------------------------------
-
作者:
男 zzcaism (LionKing) ★☆☆☆☆ -
普通会员
2004/5/14 9:02:56
15楼: 网管能不能帮我转到《delphi技术》呀
----------------------------------------------
-
作者:
男 xacz (带头大哥) ★☆☆☆☆ -
盒子活跃会员
2004/5/14 12:15:01
16楼: 不用这么复杂吧?为什么要给RaiseSalary动态创建参数呢?奇怪。
iamdream 写的很好啊
----------------------------------------------
-
作者:
男 zzcaism (LionKing) ★☆☆☆☆ -
普通会员
2004/5/14 13:27:33
17楼: iamdream写的不是我用的TSqlStoreProc呀
----------------------------------------------
-
作者:
男 xacz (带头大哥) ★☆☆☆☆ -
盒子活跃会员
2004/5/14 14:04:21
18楼: DELPHI里proc控件使用方法都差不多的呀,而且都会自动关联参数的,不知道你为何这样写 :(
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS