我有一个保存事件
Private Sub cmdsave_Click()
  On Error GoTo ERR:
    c_CON.db.BeginTrans'开始事务
         for i=1 to 10
             '插入入库记录的代码
               ( 略)
             '在这里我有一个全局过程
              Call UpdateYmjy(100,150)
      
         next
    c_CON.db.CommitTrans '提交事务
 
 ERR:
  c_CON.db.RollbackTrans
  MsgBox "发生错误,调价不成功 " & Ssql & "", vbCriticalend subPublic Sub UpdateYmjy(sl As Double, je As Double)
Dim Wsl As ADODB.Parameter
Dim Wje As ADODB.Parameter
Dim Mycommand As New ADODB.Command
Mycommand.ActiveConnection = c_CON.db.Connect '对象的连接字符串和上面是一样的即也是 c_con的连接字符串
 
 Set Wsl = New ADODB.Parameter
 Wsl.Type = adDouble
 Wsl.Value = sl
 Mycommand.Parameters.Append Wsl
 
 Set Wje = New ADODB.Parameter
 Wje.Type = adDouble
 Wje.Value = je
 Mycommand.Parameters.Append Wje Mycommand.CommandText = "gxymjyb"‘存储过程
 Mycommand.CommandType = adCmdStoredProc
 Dim ree As New ADODB.Recordset
 Set ree = Mycommand.Execute()
end sub我想请教的问题是:如果错误发生的滚回c_con对象倒是容易,但Mycommand
怎么滚回呢!(mycommand 是在过程内 是不是也可以定义成一个全局的对象叱!)

解决方案 »

  1.   

    你把cmd_save中的连接c_CON传给UpdateYmjy就可以了Public Sub UpdateYmjy(byval vCnn as adodb.conntion,sl As Double, je As Double)
       在这里的操作使用传入的vCnn,这样就会都滚回了end sub
      

  2.   

    楼上的兄弟:
      我的c_con 本身就是一个全局连接对象,所以不须要传呀!
      再有在 滚回c_con 不见得会滚回  Mycommand.Execute()吧!Mycommand也有自己的
    的事务处理耶,在线等!
      

  3.   

    问题是你在Mycommand重新定义它的连接呀,我一直是这样操作的
    function A
    定义一个连接nCnn  call B(byval nCnn)
    end function
    function B(byval vCnn as adodb.connection)
      操作vCnn
    end b
      

  4.   

    Mycommand.ActiveConnection = c_CON.db.Connect '对象的连接字符串和上面是一样的即也是 c_con的连接字符串_____问题就在这里,你实际上是定义了一个新的连接
      

  5.   

    我明白你的意思,我为什么一定要用 mycommand 是因为在DB2中执行存储过程非得这么做。照你那样的操作也不能滚回MYcommand所做的操作,它只能说明它和C_CON使用的是同一个连接字符串并不见得在同一个处理事务中你认为呢? DB2中执行存储过程有没有别的好方法呀/在此谢过你了!
      

  6.   

    Mycommand.ActiveConnection = c_CON.db.Connect '对象的连接字符串和上面是一样的即也是 c_con的连接字符串你改成Mycommand.ActiveConnection = vCnn(传进来的),你再试一下
      

  7.   

    不行,程序报错说是不可接受的类型
    可能
    Mycommand.ActiveConnection = vCnn 根本就不是同一个类型
      

  8.   

    Public Sub UpdateYmjy(byval vCnn as adodb.connection, sl As Double, je As Double)
    Dim Wsl As ADODB.Parameter
    Dim Wje As ADODB.Parameter
    Dim Mycommand As New ADODB.CommandMycommand.ActiveConnection = vcnn'这样不行吗 
     Set Wsl = New ADODB.Parameter
     Wsl.Type = adDouble
     Wsl.Value = sl
     Mycommand.Parameters.Append Wsl
     
     Set Wje = New ADODB.Parameter
     Wje.Type = adDouble
     Wje.Value = je
     Mycommand.Parameters.Append Wje Mycommand.CommandText = "gxymjyb"‘存储过程
     Mycommand.CommandType = adCmdStoredProc
     Dim ree As New ADODB.Recordset
     Set ree = Mycommand.Execute()
    end sub
      

  9.   

    Dim Mycommand As New ADODB.Command
    改成Dim Mycommand As  ADODB.Command
      

  10.   

    我试过Mycommand.ActiveConnection = vcnn'没有问题呀
      

  11.   

    行,但遇到了一个新问题:
       不传Vcnn时我的记录正常(如插入了一条新的记录,)但是用了之后我发现插入的新记录
    的字符串fields 只取了最前一个字符串怪事!
      

  12.   

    Dim Mycommand As New ADODB.Command
    改成Dim Mycommand As  ADODB.Command这个地方我说错了,你还是用Dim Mycommand As New ADODB.Command
      

  13.   

    不传的时候是这样的如: s_hh(货号) 值为 xy0020
    如果传对象的话就是如: s_hh(货号) 值为 x所有字符型字段都是这样数值型正常 我跟踪SQL 模板 看到的结果是:
    exec gxymjyb N' ', N'N', 258, N'X', N'无', 1.000000000000000e+001, 1.670000000000000e+002应该是:
    exec gxymjyb N' ', N'Nc', 258, N'Xy0020', N'无批号', 1.000000000000000e+001, 1.670000000000000e+002明白了吗前面那句明显只取了最前一位的字符串你说是不是和 mycommand.type 这个变量的类型
    定义有关???
      

  14.   

    这个与mycommand.type没有关系,这个变量是用于识别你传的Mycommand.CommandText = "gxymjyb"是个什么东西,参数为adCmdStoredProc说明“gxymjyb”是个存储过程,这个一时倒不清楚。你看一下存储过程中的内容是什么,从道理上讲应该不会这样的,
      

  15.   

    Set Ws_ph = New ADODB.Parameter
     Ws_ph.Type = adBSTR
     Ws_ph.Value = s_ph
     Mycommand.Parameters.Append Ws_ph我讲错了, 是不是 
     Ws_ph.Type = adBSTR    这个个类型有问题呢!  
    今天真是不好意思明天晚上就要转到 db2 里去急死人呀再不行真只有把它们写到程序里了唉!
    这是一个更新药品月未结余信息的存储过程!CREATE Procedure gxymjyb
      @Month char(4),
      @s_type char(10),
      @dept int,
      @HH CHAR(20),
      @PH CHAR(50),
      @n_sl float,
      @n_je float
    as 
      declare @sl_Filed char(20)
      declare @je_Filed char(20)
      declare @ssql char(1000)
      declare @recordcount int
      declare @s_yplx char(30)
      declare  @s_hh char(20)
      declare  @s_ph char(50)  set @s_hh=''''+rtrim(convert(nvarchar,@hh))+''''
      set @s_ph=''''+rtrim(convert(nvarchar,@ph))+''''  if left(@hh,2)='XY'
              set @s_yplx='西药'
       if left(@hh,2)='CY'
              set @s_yplx='中成药'
      if left(@hh,2)='ZY'
              set @s_yplx='中草药'  --set @month=MONTH(GETDATE())
      set @sl_filed='n_'+rtrim(convert(varchar,@month))+rtrim(convert(varchar,@s_type))+'s'
      set @je_filed='n_'+rtrim(convert(varchar,@month))+rtrim(convert(varchar,@s_type))+'je' select @recordcount  =count(*) from yk_ymjy  where rtrim(s_hh) =rtrim(@hh)  and isnull(rtrim(s_ph),'')=convert(nvarchar,rtrim(@ph))  and n_year=convert(nvarchar,year(getdate())) and deptid=@dept
     print @recordcount
     
    if isnull(@recordcount,0)>0 
            begin 
                  set @ssql=' update yk_ymjy set '+ convert(varchar,@sl_filed)+'=isnull('+convert(varchar,@sl_filed)+',0)+('+convert(varchar,@n_sl)+'),'+convert(varchar,@je_filed)+'= isnull('+convert(varchar,@je_filed)+',0)+('+convert(varchar,@n_je)+') where s_hh='+convert(varchar,@s_hh)+' and isnull(s_ph,'''')='+RTRIM(@s_ph)+'  and n_year='+convert(varchar,year(getdate())) +'  and deptid='+convert(varchar,@dept)
                  exec(@ssql)
                  print @ssql
           end 
     if isnull(@recordcount,0)=0 
           begin 
                             insert into yk_ymjy(deptid,s_hh,s_yplx,s_ph,n_year) values(@dept,@hh,@s_yplx,@ph,year(getdate()))
                             set @ssql=' update yk_ymjy set '+ convert(varchar,rtrim(@sl_filed))+'= isnull('+convert(varchar,rtrim(@sl_filed))+',0)+('+convert(varchar,rtrim(@n_sl))+'),'+convert(varchar,rtrim(@je_filed))+'= isnull('+isnull(convert(varchar,rtrim(@je_filed)),0)+',0)+('+convert(varchar,rtrim(@n_je))+') where id='+CONVERT(VARCHAR,SCOPE_IDENTITY())
                             exec(@ssql)
                             print @ssql
          end
    GO
      

  16.   

    我没有QQ,只有MSN:[email protected]
      

  17.   

    都不行,真是怪了改用
    Mycommand.ActiveConnection = c_CON.db.Connect 就一切OK  不过今天真是谢你了担误你工作!
      

  18.   

    那你再试一下adVarChar或adVariant,我也奇怪为什么会这样呢??奇怪??
      

  19.   

    搞定了是参数的长度没指定如
      wsl.size=20