function TTest.test(varT: OleVariant): OleVariant;
Var
  adoCnn            : Connection;
  adoCmd            : Command;
   adoPrm_t          : Parameter;
  adoPrm_IDType     : Parameter;
  adoPrm_MaxID      : Parameter;
  sRet              : String;
  bln_OpenCnn       : Boolean;
  bln_OpenTran      : Boolean;
Begin
  Try    outputDebugString(PChar('A0001:' + vartostr(varT)));    bln_OpenTran := false;
    bln_OpenCnn := false;    // 打开数据库连接
    adoCnn := CoConnection.Create;
    adoCnn.ConnectionTimeout := 180;
    adoCnn.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=gxjj;Password=a;Initial Catalog=gxjj;Data Source=ENJSKY';
    adoCnn.CursorLocation := adUseClient;
    adoCnn.IsolationLevel := adXactReadCommitted;
    adoCnn.Open('', '', '', 0);
    bln_OpenCnn := True;    // 开始事务
    adoCnn.BeginTrans;
    bln_OpenTran := True;    adoCmd := CoCommand.Create;
    adoCmd.CommandText := 'pMaxID_A';
    adoCmd.CommandType := adCmdStoredProc;
    adoPrm_t := adoCmd.CreateParameter('@t', adWChar, adParamInput, 1, '');
    adoCmd.Parameters.Append(adoPrm_t);    // 设置参数 strIDTpye
    adoPrm_IDType := adoCmd.CreateParameter('@strIDType', adWChar, adParamInput, 6, '000002');
    adoCmd.Parameters.Append(adoPrm_IDType);    // 设置参数 strMaxID
    adoPrm_MaxID := adoCmd.CreateParameter('@strMaxID', adVarWChar, adParamOutput, 255, '');
    adoCmd.Parameters.Append(adoPrm_MaxID);    // 执行保存的存储过程
    adoCmd._Set_ActiveConnection(adoCnn);
    adoCmd.Execute(EmptyParam, EmptyParam, adCmdStoredProc);    // 获得最大编号返回值
    sRet := adoPrm_MaxID.Value;    outputDebugString(PChar('A0001:' + vartostr(sRet)));    result := sRet;    // 提交变化
    adoCnn.CommitTrans;
    bln_OpenTran := False;    adoPrm_t := Nil;
    adoPrm_IDType := Nil;
    adoPrm_MaxID := Nil;
    adoCmd := Nil;
    adoCnn.Close;
    adoCnn := Nil;  Except
    On e: Exception Do
    Begin
      result := e.Message;
      If (bln_OpenTran=True) Then
      Begin
        adoCnn.RollbackTrans;
            adoPrm_t := Nil;
        adoPrm_IDType := Nil;
        adoPrm_MaxID := Nil;
        adoCmd := Nil;
      End;      If (bln_OpenCnn=True) Then adoCnn.Close;      adoCnn := Nil;    End;
  End;
  End;
这个是源码
请高手赐教,解决马上给分,在线等待
操作oracle没有问题,测试通过了

解决方案 »

  1.   

    是的 
    不通过 
    报错 过程pMaxID_A需要参数@strIDType 但未提供该参数adoCmd.CommandText :='{call pMaxID_A(?,?,?)}';现在我改成这样了 
    又报错:至少一个参数没有指定值
      

  2.   

    你这个不好说。但一般要注意的是:
    ------------------------
    1、首先确定连接字符串没问题
    2、确定连接
    3、确定存储过程名字正确
    4、参数的类型、个数要匹配你可以用ADOStoredProc组件试一下。
      

  3.   

    真不好意思ADOStoredProc组件
    还不会用,没有用过
      

  4.   

    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GO/*-------------------------------------------------
     * 存储过程:  pMaxID_A
     * 作者:      Mike
     * 功能:      获得一级编号中指定类型的最大编号
     * 参数:      t               无用的参数
     *            strIDTpye       一级编号类型
     *            intSize         该编号需要的长度
     *            strMaxID        (输出)最大一级编号
    -------------------------------------------------*/ALTER        PROCEDURE pMaxID_A
        @strIDType    char(6),
        @strMaxID    varchar(200) out
    as
    declare @intID           numeric(20)          -- 最大编号值
    declare @intSize         numeric(20)          -- 最大编号长度
    declare @strLoop         varchar(1)          -- 是否是循环
    declare @intMinValue     numeric(20)          -- 范围.最小编号
    declare @intMaxValue     numeric(20)          -- 范围.最大编号
    declare @intExist        numeric(20)          -- 判断编号是否已经存在set nocount on  -- 确定该最大编号类型是否已经存在
      SELECT @intExist = COUNT(IDTYPE)
      FROM   MAXID
      WHERE  IDTYPE = @strIDType
      AND    ID1    = '0'
      AND    ID2    = '0'
      -- 获得最大编号类型的长度
      SELECT @intSize = IDSIZE,
             @strLoop = IDLOOP,
             @intMinValue = IDMIN,
             @intMaxValue = IDMAX
      FROM   MAXIDTYPE
      WHERE  IDTYPE = @strIDType  -- 返回错误:最大编号长度定义错误,长度不能为 0
      --           或最大编号范围指定错误
      if @intSize=0
        goto errSizeError  
      if @intMinValue<0
       set @intMinValue = 0  -- 如果这个最大编号没有使用,则需要重新分配一个最大编号
      if @intExist=0
      begin
        set @intID = @intMinValue
        insert into maxid(idtype, id1, id2, maxid) values (@strIDType, '0', '0', @intID);
      end
      else
      begin
        -- 从最大编号表中获得最大编号,并锁定该行
        SELECT @intID = MAXID
        FROM   MAXID with (ROWLOCK)
        WHERE  IDTYPE = @strIDType ;
      
        set @intID = @intID + 1           -- 最大编号加一
        
        -- 校验长度范围
        if len(cast(@intID as char))>@intSize
          if @strLoop = '1'            -- 如果是循环可用的最大编号
            set @intID = @intMinValue
          else
            goto errSizeError        -- 返回错误:超出最大编号范围
        
        IF @intID>@intMaxValue and @intMaxValue <> -1
          if @strLoop = '1'            -- 如果是循环可用的最大编号
            set @intID = @intMinValue
          else
            goto errSizeError        -- 返回错误:超出最大编号范围
        
        -- 更新最大编号表
        UPDATE MAXID SET MAXID  = @intID WHERE  IDTYPE = @strIDType AND ID1 = '0' AND ID2 = '0';
      end  -- 输出最大编号
      -- set @strMaxID = LPAD(TO_CHAR(intID), intSize, '0');  set @strMaxID = right('00000000000000000000000000000000'+cast(@intID as varchar(100)),@intSize)if @@error <> 0 GOTO errSizeErrorerrSizeError:
        set @strMaxID = -1;set nocount off
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
    这个是我的存储过程 
    你留个邮箱,我把代码也发给你,谢谢哦
    向你学习
      

  5.   

    你的要求是不是在DELPHI中调用sql server中的存储过程啊。
      

  6.   

    就是的 
    最好是以 ado 的方式来调用,就我提供的这种
      

  7.   

    你先用下面的方式试试ADOStoredProc1.ProcedureName := XXXx;
      ADOStoredProc1.Parameters.CreateParameter();
      ADOStoredProc1.Parameters.ParamByName('').ASXXXX := XXXX;
      ADOStoredProc1.Parameters.CreateParameter();
      ADOStoredProc1.Parameters.ParamByName('').ASXXXX := XXXX;
      ADOStoredProc1.ExecProc;
      

  8.   

    终于被我搞出来了关键代码如下:
    adoCmd := CoCommand.Create;
        adoCmd.CommandText := 'pMaxID_A';
        adoCmd.CommandType := adCmdStoredProc;    adoCmd.Parameters.Append(adoCmd.CreateParameter('@strMaxID', adVarChar, adParamOutput, 200, '1'));    adoCmd.Parameters.Append(adoCmd.CreateParameter('@strIDType', adChar, adParamInput, 6, '000001'));    // 执行保存的存储过程
        adoCmd._Set_ActiveConnection(adoCnn);
        adoCmd.Execute(EmptyParam, EmptyParam, adCmdStoredProc);    // 获得最大编号返回值
        // strMaxID := adoPrm_t.Value;    showMessage(vartostr(adoCmd.Parameters.Item[0].value));存储过程如下:
    ALTER        PROCEDURE pMaxID_A
        @strMaxID    varchar(200)='' out,
        @strIDType    char(6)=''
    关键问题:
    1,要将 out 参数放在前面
    2,要将没一个参数给出一个默认的值,即使是空也要给以上为个人总结