CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  数据库相关

delhpi用存储过程(返回参数的)怎么回事?

楼主NewQger(Q哥)2006-03-05 22:46:02 在 Delphi / 数据库相关 提问

我的存储过程:  
  CREATE   PROCEDURE   proGetNewId  
  @FldKey   varchar(20),  
  @NewId   varchar(18)   OUTPUT  
    AS  
  declare   @AutoID   as   bigint  
  begin   transaction  
          select   @AutoID   =(nowId)   +   1   from   sysmaxid   with(updlock)   where     fldKey   =   @FldKey  
        --取出来最大加上一  
          update   sysmaxid   set   nowid   =   @AutoID   where   fldKey   =   @FldKey  
          select   @NewId   =   cast(@AutoID   as   varchar(18))  
  commit   transaction  
  Go  
  调用:  
  //   获取记录号***************  
  function   gFunGetNewId(fld:string):string;  
  var  
        adoPro:TADOStoredProc;  
        strNewId   :string;  
  begin  
        if   adoPro   =   nil   then   adoPro:=   TADOStoredProc.create(nil);  
        adoPro.Connection   :=gADOCn;         //在这报错啊,为什么?  
        adoPro.ProcedureName   :=   'proGetNewId;1'   ;  
        adoPro.Parameters.Refresh   ;  
        adoPro.Parameters.parambyname('@FldKey').value:=   fld;  
        adoPro.Parameters.parambyname('@NewId').value   :='';  
        adoPro.open;  
        showmessage(adoPro.Parameters.parambyname('@NewId').value);  
        result:=   adoPro.Parameters.parambyname('@NewId').value;  
  end;  
   
  请大家看看那里有问题啊 问题点数:20、回复次数:11Top

1 楼Corn1(玉米)回复于 2006-03-06 09:48:12 得分 4

gADOCn是什么?有没有引用定义它的单元?  
  proGetNewID;1,后面的1是什么意思?存储过程名称是这个?  
  showMessage,result这两句也有错,返回参数不能这样调用,要到数据集里去取。Top

2 楼cjianwen(空前)回复于 2006-03-06 10:02:01 得分 4

function   gFunGetNewId(fld:string):string;  
  var  
  qr:TAdoquery;  
  begin  
  result:='';  
    qr:=TAdoquery.create(nil);  
  try  
    qr.connection:=anAdoconnection;//一个连接  
    with   qr   do  
        begin  
          close;  
          sql.clear;  
          sql.add('exec   proGetNewId   :p1,:p2');  
          parameters[0].asString:=fld;  
          execsql;  
        end;  
    result:=qr.parameters[1].AsString;  
    finally  
  qr.free;  
  end;  
   
  用这个试试,没测试过,不知道行不行!Top

3 楼aderly(冬冬)回复于 2006-03-06 10:35:24 得分 4

with   ADOStoredProc1.Parameters.AddParameter   do  
      begin  
          Name:='out3';  
          DataType:=ftString;  
          Direction:=pdOutput;  
          Size:=100;  
      end;  
      ADOStoredProc1.Prepared:=true;  
      ADOStoredProc1.ExecProc;Top

4 楼NewQger(Q哥)回复于 2006-03-06 13:59:37 得分 0

to   玉米:   gADOCn是个全局的连接,已经连上单元已经引用,proGetNewID;1   是我看别人还有ADOStoredProc   上有这个,当然我也测试过   没有;1   的.后边的参数引用对不对不清楚,但是在adoPro.Connection   :=gADOCn;   这个地方报错的.  
  to   空前:用ADOQuery已经测试通过.但是   我的连接gADOCn是在另一单元创建的,而我在   本单元使用gADOCn时,报错.但我用另一单元的   查询函数没问题,还是   aQur.connection   :=gADOCn;报错.  
  这个gADOCn连接我在窗体单元里使用没问题.  
  下边是我的直接定义ADOQuery设其连接为gADOCn代码:  
  //   获取记录号***************  
  function   gFunGetNewId(fld:string):string;  
  var  
        adoPro:TADOQuery;  
        adoQurNewId:TadoQuery;  
        strNewId   :string;  
  begin  
        if   adoQurNewId   =   nil   then   adoQurNewId.Create(nil);  
        adoQurNewId.Connection   :=   gADOCn;   //就在这里报错???????????????????  
        result:=   '0000123';  
  end;  
  Top

5 楼NewQger(Q哥)回复于 2006-03-06 14:03:06 得分 0

但我这样用就可以:  
  //   获取记录号***************  
  function   gFunGetNewId(fld:string):string;  
  var  
        adoPro:TADOQuery;  
        adoQurNewId:TadoQuery;  
        strNewId   :string;  
  begin  
        if   adoPro   =   nil   then   adoPro:=   TADOQuery.Create(nil);  
        adoPro:=   gFunSearchData('   exec   pGetNewId   '   +   fld   +   '   ',10)   ;  
        strNewId:=   adoPro.FieldValues['aNewId'];  
        result:=strNewId;  
  end;  
  //gFunSearchData函数是在定义gADOCn连接的那个单元的代码如下:  
  {**     公用查询,传SQL语句后执行     返回   Query   ****}  
  function   gFunSearchdata(sql:string;intOut:Integer):TADOQuery;  
  var  
      aQuery   :TADOQuery;  
  begin  
      aQuery:=TADOQuery.Create(nil);  
      aQuery.Connection   :=   gADOCn;  
      aQuery.SQL.text   :=   sql;  
      aQuery.CommandTimeout   :=   intOut;  
      aQuery.Open;  
      result:=aQuery;  
  end;Top

6 楼wjowner(Jerry.W)回复于 2006-03-06 14:05:39 得分 4

你的gADOCn是不是定义在对象里面的?如果是,你要用:实例名.gADOCn来引用它(如Form1.gADOCn)Top

7 楼NewQger(Q哥)回复于 2006-03-06 14:05:49 得分 0

当然我把存储过程改成不带返回参数,但是返回结果集是   select   Cast(@newId   as   varchar(18))   as   aNewIdTop

8 楼NewQger(Q哥)回复于 2006-03-06 14:07:29 得分 0

不是对象里,而是一个公用单元,上边已经说过,这个连接在窗体单元里用没问题.Top

9 楼whbo(王红波(年轻人,要有所作为))回复于 2006-03-06 14:10:19 得分 4

var   intID   :integer;  
  ................  
  adoPro.Parameters.parambyname('@NewId').direction:=pdoutput;  
  adoPro.Parameters.parambyname('@NewId').value   :=intID;  
  adoPro.execute;  
  intID:=adoPro.Parameters.parambyname('@NewId').value;  
        result:=   adoPro.Parameters.parambyname('@NewId').value;  
  Top

10 楼bluekitty(软件黑领)回复于 2006-03-06 14:11:14 得分 0

gADOCn是全局对象么?如果不是就按wjowner(Jerry.W)   的改Top

11 楼NewQger(Q哥)回复于 2006-03-06 14:19:57 得分 0

连接所在那个单元的头部分是这样的,难道全局变量要加public???  
  unit   UGdb;  
  interface  
      uses   SysUtils,Db,AdoDb;  
  function   gFunConnect():Boolean;   //   连接数据库  
  function   gFunSearchdata(sql:string;intOut:Integer):TADOQuery;   //通用查询  
  var  
      gADOCn   :TADOConnection;     //公用全局连接  
  implementation  
  ......Top

相关问题

  • 存储过程是怎么回事?
  • 在存储过程中给参数赋默认值的时候使用getdate()总是提示出错,是怎么回事?
  • 急!我有两个向数据库表中插入记录的存储过程,编译都通过了,但调试总不对,怎么回事?Bug在哪里?另外,如何直接在SQL*Plus调试或测试带输出参数的存储过程?
  • 谁能简单介绍一下存储过程是怎么回事?
  • 我的Sybase在建立存储过程时经常死掉,怎么回事?
  • 一个存储过程里有多个begin和end,这是怎么回事啊?
  • 存储过程返回参数给存储过程?
  • 存储过程的参数问题
  • 小问题,存储过程传参数
  • ADO,及参数化存储过程

关键词

  • 存储过程
  • 连接
  • 测试
  • adopro
  • gadocn
  • fldkey
  • newid
  • parambyname
  • adoqurnewid
  • progetnewid

得分解答快速导航

  • 帖主:NewQger
  • Corn1
  • cjianwen
  • aderly
  • wjowner
  • whbo

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo