有具体实例和注释是最好了...
多谢多谢

解决方案 »

  1.   

    存储过程中,不是可以设置output输出参数吗,调用后,直接用adoquery的参数访问这个参数就行了
    ADOQuery1.Parameters.ParamByName()
      

  2.   

    你会写存储过程么?会用delphi么?如果会你用就用ado组件就可以了
      

  3.   

    http://objectmix.com/ado-dao-rdo-rds/392311-return-value-stored-procedure.html
      

  4.   

    对于存储过程的调用使用的控件TADOStoredProc。
    创建方法和连接都很简单。
    StorPro:=TADOStoredProc.Create(nil);
    然后定义存储过程的名字和输入参数:
    StorPro.ProcedureName:=ProName;
    StorPro.Parameters.clear;
    StorPro.Close;
    StorPro.Parameters.CreateParameter('as_gh', ftString, pdInput , 10, NULL);
    StorPro.Parameters.CreateParameter('as_in', ftString, pdInput , 100, NULL);
    StorPro.Parameters.CreateParameter('as_out', ftString, pdOutput , 255, NULL);
    大家可能看到函数CreateParameter中的第3个参数,pdInput 就是用来定义此参数是输入参数函数输出参数。具体的参数函数是:存储过程参数名称、类型、输入输出参数类型、长度还有就是最后一个参数Delphi帮助中说是Value: OleVariant,不过我没有用过。一般我赋值为NULL。
    上面的过程是定义这个存储过程的参数。在调用的时候自然需要给参数赋值。
    赋值过程为(其中WorkID和DataID是事先定义好的两个变量):
    StorPro.Parameters[0].value :=WorkID;
    StorPro.Parameters[1].value :=DataID;
    赋值完成后运行此存储过程:
    StorPro.prepared:=true;
    StorPro.ExecProc;
    好了存储过程调用以后,我们希望得到这次存储过程返回的参数'as_out'的值。
    fxh7622:=StorPro.Parameters.parambyname('as_out').Value;
    这个时候存储过程返回的值就保存在了fxh7622里面。
    其实获得存储过程的返回值比较简单,希望对大家有帮助。
      

  5.   

    1. sql存儲過程:USE [MES]
    GO
    /****** Object:  StoredProcedure [dbo].[GetNXJL]    Script Date: 09/27/2010 13:53:20 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[GetNXJL] 
    @bh varchar(10),
    @yf int=0
    AS
    BEGIN
    SET NOCOUNT ON;
    if @yf=0
    begin
    select *,convert(varchar(10),DATEADD(YEAR,1,kxyf)-1,111)as jssj,b.kxts-b.yxts as syts from(
    select a.*,
    cast((case a.Account_Id when a.Account_Id then(select isnull(SUM(CAST(REPLACE(REPLACE(SUBSTRING(CONVERT(nvarchar(20),isnull(qjsj,'00:00'),120),12,5),':3','.5'),':','.') AS numeric(18, 2))),0) from RES_KQQJ where Account_Id=a.Account_Id and qjrq>=a.kxyf and (qjlb='探親假' OR qjlb='年休假'))end)/8.0 as numeric(18,2)) as yxts
    from(
    select account_id,full_name,CONVERT(varchar(4),getdate(),111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6)as kxyf,cast(dbo.Get_NXTS_JCRQ(@bh,jcrq,dateadd(day,1,CONVERT(varchar(4),year(getdate()))+substring(CONVERT(varchar(10),jcrq,111),5,6))) as numeric(18,2))as kxts
    from Res_User_Temp where Account_Id=@bh)a)b
    end else
    begin
      if @yf=-1 
      begin
    select b.*,b.kxts-b.yxts as syts from(
    select a.*,
    cast((case a.Account_Id when a.Account_Id then(select isnull(SUM(CAST(REPLACE(REPLACE(SUBSTRING(CONVERT(nvarchar(20),isnull(qjsj,'00:00'),120),12,5),':3','.5'),':','.') AS numeric(18, 2))),0) from RES_KQQJ where Account_Id=a.Account_Id and (qjrq between a.kxyf and a.jssj) and (qjlb='探親假' OR qjlb='年休假'))end)/8.0 as numeric(18,2)) as yxts
    from
    (
    select account_id,full_name,
    convert(varchar(10),DATEADD(YEAR,1,CONVERT(varchar(4),year(getdate())-1,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6))-1,111)as jssj,
    CONVERT(varchar(4),year(getdate())-1,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6)as kxyf,
    cast(dbo.Get_NXTS_JCRQ(@bh,jcrq,dateadd(day,1,CONVERT(varchar(4),year(getdate())-1)+substring(CONVERT(varchar(10),jcrq,111),5,6))) as numeric(18,2))as kxts from Res_User_Temp where Account_Id=@bh
    )a
    )b
      end
      else
      begin
      select b.*,b.kxts-b.yxts as syts from(
    select a.*,
    cast((case a.Account_Id when a.Account_Id then(select isnull(SUM(CAST(REPLACE(REPLACE(SUBSTRING(CONVERT(nvarchar(20),isnull(qjsj,'00:00'),120),12,5),':3','.5'),':','.') AS numeric(18, 2))),0) from RES_KQQJ where Account_Id=a.Account_Id and (qjrq between a.kxyf and a.jssj) and (qjlb='探親假' OR qjlb='年休假'))end)/8.0 as numeric(18,2)) as yxts
    from
    (
    select account_id,full_name,
    convert(varchar(10),DATEADD(YEAR,1,CONVERT(varchar(4),year(getdate())-2,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6))-2,111)as jssj,
    CONVERT(varchar(4),year(getdate())-2,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6)as kxyf,
    cast(dbo.Get_NXTS_JCRQ(@bh,jcrq,dateadd(day,1,CONVERT(varchar(4),year(getdate())-2)+substring(CONVERT(varchar(10),jcrq,111),5,6))) as numeric(18,2))as kxts from Res_User_Temp where Account_Id=@bh
    )a
    )b
      end
    end
    END
    GO2. 執行: 
    exec GetNXJL '12475',0 /*
    account_id  full_name                                          kxyf           kxts                                    yxts                                    jssj       syts
    ----------- -------------------------------------------------- -------------- --------------------------------------- --------------------------------------- ---------- ---------------------------------------
    32524       陸蘭勤                                                2010/05/05     5.00                                    0.00                                    2011/05/04 5.00*/3. 再用ado組件循環將上面的帶參數的存儲過程(for...to...do while...not...do)寫入textbox...類似以下:procedure TRes_HrCq_HBD_F.GetDistinctHBCB;
    begin
      cx_hbcb.Properties.Items.Clear;
      cx_hbcb.Text:='';
      qry_BaseTemp.Close;
      qry_BaseTemp.SQL.Clear;
      qry_BaseTemp.SQL.Add( ' select CB from Res_User_Temp where CB is not null group by CB ' );
      qry_BaseTemp.Open;
      while not qry_BaseTemp.Eof do
      begin
        cx_hbcb.Properties.Items.Add(Trim(qry_BaseTemp.fieldbyname('CB').AsString));
        qry_BaseTemp.Next;
      end;
    end;
      

  6.   

    程序提示:
    连接断开
    parameter '@nomber' not found 
    这个是什么意思?
      

  7.   

    事件探查器提示执行了这句
    exec [test]..sp_procedure_params_rowset N'getinfo', 1, NULL, NULL
      

  8.   

    你确定不是number而是nomber吗?
      

  9.   

    其实就当是parameter '@abc' not found 就是了
      

  10.   

      这。你用的是SQL  SERVER?
      parameter '@abc' not found 就是存储过程里没这个参数。
      

  11.   

     你不是有一个存储过程吗?你看那存储过程是怎么写的。
      比如create or replace procedure 存储过程名(param1 in type,param2 out type) 
      这不有两个参数吗,分别为param1,param2 一个是in,一个是out
      你就一个一个对着这个参数名字来就是了。
      
      
      

  12.   

      或者说你直接用数字来,类似下面这样
      
      ADOStoredProc1.Close; 
      ADOStoredProc1.ProcedureName:= 'P_Add;1 ';//主意此句 
      ADOStoredProc1.Parameters.Refresh; 
      ADOStoredProc1.Parameters[1].value:=edit1.Text; 
      ADOStoredProc1.Parameters[2].value:=edit2.Text; 
      ADOStoredProc1.Parameters[3].value:=edit3.Text; 
      ADOStoredProc1.Prepared; 
      sp1.ExecProc;  
      

  13.   

    sql:
    exec GetNXJL @bh=32524,@yf=0delphi:
          qry_BaseTemp.Close;
          qry_BaseTemp.SQL.Clear;
          qry_BaseTemp.SQL.Add('  exec SP_HR_DAY_AUDIT @bh=12475,@yf=0 ');//根據自己的需要修改
          qry_BaseTemp.ExecSQL;
      

  14.   

      你不是D2010吗?貌似那个生成的程序是很大的。没玩过,听人说
      project->option->勾选Build with runtime packages,这样程序会小,运行时会多吃内存。
      没玩过2010,你自己查查吧。
      大点无所谓吧。现在的电脑可都比较好啊。
      

  15.   

    再问个问题.如何将delphi项目中引用的所有的项目在资源管理器里面都列出来?
    我都找不到到底是引用了那些东西.
      

  16.   

      哪的资源管理器啊?是IDE里面的那个吗?
      view->project manageer
      view->units
      .
      .
      .
      要看这种类型的东西一般都是通过视图view来查看的。
      具体没搞懂你说的。
      再或者你到project->view source里面看uses 下面的内容
      
      

  17.   

    view source下面是可以看见引用了什么模块的.但是没有相对或者是绝对路径.所以我找不到具体的那个模块在哪里.比如说我想修改一下引用的模块的内容.我就需要找到它,然后修改呀.
      

  18.   

    另外再问一个问题.delphi 2010 的系统托盘是怎么实现的?
    我的目的是要修改一下别人做好的程序里面的这个托盘图标.我没找到在哪里修改.
      

  19.   

      错,有路径的,你没看到,是因为你的这个project里面没有去引用其他文件夹的单元。
      
      

  20.   

      你要改图标容易。
      那个程序里肯定有一个 xxxx  :   TNotifyIcondataA;  //用于增加和删除系统状态图标
      xxxx.hIcon   :=   Application.Icon.handle;     //指定系统状态栏显示应用程序的图标句柄
      一般来说他的托盘图标就是应用程序的图标。
      假设是这样的,那么你只要去改应用程序的图标。
      project->options->application里面你就可以看到一个icon了。改吧。
      下班,闪人。
      

  21.   

      如果xxxx.hIcon不是Application.Icon.handle,那你就改成你要指定图标就好了。
      

  22.   

    我找到了.改好了.今天又遇见了新的麻烦.
    .这个程序生成了一个txt格式的报表文件.
    上下各有一行文字.中间是从数据库读取出来的.
    怎么也找不到生成上下上下落款在哪里.....
      

  23.   

      这。可能情况有2种
      (1)你没找到
      (2)很有可能是从某个地方接收了什么什么数据之后,又把这个数据赋值给了2个变量。
           最后再把这2个变量当作上下落款给了txt。
      
      

  24.   

      有啊.真有.有引用其他文件夹的..而且不是一个两个.很多.
      
      有的话,那就肯定会有显示,我很确定。
      D2010这个IDE和我不大熟,我跟它没什么交集啊。  东西就那么多,全放在那里,怎么也逃不掉的,耐心找。
      
      
      

  25.   

    在生成的时候,有这么两句,
    function GetDataInfo(const Buffer; Count: Cardinal): string;
    begin
      SetLength(Result, Count div 2);
      Move(Buffer, Result[1], Count);
    end;
    跟踪到result的时候.只是中间的一段内容.但是到了move执行以后,就有了上下文了...这个该怎么解决呀?
      

  26.   

      Move(Buffer, Result[1], Count);
      其中buffer为source(源数据),result[1]为destination(目标)
      move会把buffer给到result。看这个buffer从哪里来的。
      就是说你查找一下哪里用了这个GetDataInfo(*,*),找到buffer就知道了。
      

  27.   

    这个不是函数原型.这个就是使用的函数.
    使用的时候,这个函数的buffer是空值.
    ----------------------------------
    变通的解决方式是,得到了最后的值以后.用c中的replace函数,替代了其中的一个字符串.就可以得到我想要的结果了.
    不指导delphi中有没有这个函数?
      

  28.   

    function GetDataInfo(const Buffer; Count: Cardinal): string;
    begin
      SetLength(Result, Count div 2);
      Move(Buffer, Result[1], Count);
    end;这样还不是函数原型?
    你找到什么时候用的GetDataInfo这个函数,看传进来的第一个参数。
      

  29.   

    我看了那个函数原型里面 定义也很简单.
    而且.这个move函数是相当的麻烦.还有汇编语言写的代码.
    ------------------
    这样行了.能不能用个repalce直接替换一下字符串?
    --
    另外问一下:
    dephli是传递地址还是传递值?
      

  30.   

    我从网上找了一个.
    function  Replace(var s:string;const SourceChar:pchar;const RChar:pchar)
    //第一个参数是原串,第二个是模式串,第三个是替换串
    var
     ta,i,j:integer;
     m,n,pn,sn:integer;
     SLen,SCLen,RCLen:integer;//SLen表示原串的长度,SCLen表示模式传的长度,RCLen表示替换串的长度
     IsSame:integer;
     newp:array of char;//用来保存替换后的字符数组
    begin
     SLen:=strlen(pchar(s));SCLen:=strlen(SourceChar);RCLen:=strlen(RChar);
     j:=pos(string(SourceChar),s);
     s:=s+chr(0);ta:=0;i:=j;
     while s[i]<>chr(0) do   //这个循环用ta统计模式串在原串中出现的次数
     begin
       n:=0;IsSame:=1;
       for m:=i to i+SCLen-1 do
       begin
        if m>SLen then begin IsSame:=0;break; end;
        if s[m]<>sourceChar[n] then begin IsSame:=0;break; end;
        n:=n+1;
       end;
       if IsSame=1 then begin ta:=ta+1;i:=m; end else i:=i+1;
     end;
     if j>0 then
     begin
      pn:=0;sn:=1;
      setlength(newp,SLen-ta*SCLen+ta*RCLen+1);//分配newp的长度,+1表示后面还有一个#0结束符
      while s[sn]<>chr(0) do //主要循环,开始替换
      begin
       n:=0;IsSame:=1;
       for m:=sn to sn+SCLen-1 do //比较子串是否和模式串相同
       begin
        if m>SLen then begin IsSame:=0;break; end;
        if s[m]<>sourceChar[n] then begin IsSame:=0;break; end;
        n:=n+1;
       end;
       if IsSame=1 then//相同
       begin
        for m:=0 to RCLen-1 do
        begin
         newp[pn]:=RChar[m];pn:=pn+1;
        end;
        sn:=sn+SCLen;
       end
       else
       begin //不同
        newp[pn]:=s[sn];
        pn:=pn+1;sn:=sn+1;
       end;
      end;
      newp[pn]:=#0;
      s:=string(newp); //重置s,替换完成!  
     end;
    end;
    这个函数怎么用?
    我把参数直接传递进去以后.到了最后这一句.s:=string(newp);跟踪发现.newp的值是正确的,但赋给s以后,s是空值.
    --
    如果s不为空,调用函数里面的值是改变了还是没改变?
    还是要弄个str1=Replace(str1,str2,str3),这样?那么是不是需要定义replace为string类型?
      

  31.   


     默认参数是传值, 不会被改变}
    function MyF1(x: Integer): Integer;
    begin
     Inc(x);
     Result := x;
    end;
    {var参数是传址, 会被改变}
    function MyF2(var x: Integer): Integer;
    begin
     Inc(x);
     Result := x;
    end;
      

  32.   

    为什么s:=string(newp); 不成功
      

  33.   

    暂时告一段落.
    ss:='abcdefg';
      ss := StringReplace(ss, 'a', 'b' ,[rfReplaceAll, rfIgnoreCase]);
      ShowMessage(ss);
    这样可以解决.
    分都给您了.肖肖.多谢您持续的关注与帮助.多谢了.