Conn.BeginTrans
        sql = " insert into  "         
        Conn.Execute sql, N1
        
        sql = "Insert into 。"
        Conn.Execute sql, N2
        If N1 <> 1 Or N2 <> 1 Then
          Conn.RollbackTrans
        Else
           Conn.CommitTrans
        End If请教一下,这两个 Conn.Execute sql  语句真正开始执行是从  Conn.BeginTrans 开始,还是从 Conn.CommitTrans如果是从  Conn.BeginTrans 开始执行,那 Conn.CommitTrans是什么作用。如果SQL语句在拼装的过程中出现错误,就是出现ERROR,怎么结束这个事务?

解决方案 »

  1.   

    从 Conn.BeginTrans 开始执行,如果数据库执行过程没有错误,那就提交这个事务。以Conn.CommitTrans来表示这个事务已经完成了。中途出现ERROR的话,那就回滚,以Conn.RollbackTrans来表示这个事务没有执行成功。保证数据插入的一致性与完整性。
      

  2.   

    BeginTrans和CommitTrans只是一个标志,用来记录SQL命令的开始和结束,以便出错时能正确回滚。
    如果是SQL SERVER,有@@ERROR系统变量判断SQL语句的成功和失败,可以自己跳出事务。
      

  3.   

    Conn.BeginTrans 是设置sql执行的一个保存点
    CommitTrans 是开始执行批处理的命令
    如果 CommitTrans 所包含的语句中有一条执行有错误,数据库恢复到 Conn.BeginTrans 设置的保存点位置~~
      

  4.   

    Conn.BeginTrans 是设置一个保存点,保存数据库的当前状态。
      

  5.   

    Private Sub Command1_Click() 
      On Error GoTo Sub2Err
       Dim N1 As Long, N2 As Long
       NowDate = Now
         Conn.BeginTrans
            sql = " insert into 。"                Conn.Execute sql, N1        
            sql = "Insert into)"
            Conn.Execute sql, N2
            If N1 <> 1 Or N2 <> 1 Then
               Conn.RollbackTrans
            Else
               Conn.CommitTrans
            End If    
     Exit Sub
    Sub2Err:
      If Conn.BeginTrans > 0 Then Conn.RollbackTrans
      MsgBox Err.Description
    End sub我的意思是  红色代码处出现错误后直接跳到了SUB2ERR处,If Conn.BeginTrans > 0 Then Conn.RollbackTrans  这个处理方式可以吗?
      

  6.   

    ?Conn.BeginTrans得到的数值都是什么含义?
      

  7.   

    ADO有自身的Error对象
    下面来自MSDNError 对象
                Error 对象包含与单个操作(涉及提供者)有关的数据访问错误的详细信息。
    说明任何涉及 ADO 对象的操作都会生成一个或多个提供者错误。每个错误出现时,一个或多个 Error 对象将被放到 Connection 对象的 Errors 集合中。当另一个 ADO 操作产生错误时,Errors 集合将被清空,并在其中放入新的 Error 对象集。注意   每个 Error 对象都代表特定的提供者错误而不是 ADO 错误,ADO 错误被记载到运行时的例外处理机制中。例如,在 Microsoft Visual Basic 中,产生特定 ADO 的错误将触发 On Error 事件并出现在 Err 对象中。关于 ADO 错误的完整列表,请参阅 ADO 错误代码主题。通过 Error 对象的属性可获得每个错误的详细信息,其中包括以下内容: Description 属性,包含错误的文本。
    Number 属性,包含错误常量的长整型整数值。
    Source 属性,标识产生错误的对象。在向数据源发出请求之后,如果 Errors 集合中有多个 Error 对象,则将会用到该属性。
    SQLState 和 NativeError 属性,提供来自 SQL 数据源的信息。 
    出现提供者错误时,Error 对象将被放在 Connection 对象的 Errors 集合中。ADO 支持由单个 ADO 操作返回多个错误,以便显示特定提供者的错误信息。要在错误处理程序中获得丰富的错误信息,可使用相应的语言或所在工作环境下的错误捕获功能,然后使用嵌套循环枚举出 Errors 集合的每个 Error 对象的属性。Microsoft Visual Basic 及 VBScript   如果没有有效的 Connection 对象,则需要检索 Err 对象的错误信息。与提供者一样,ADO 在进行可能引发新的提供者错误的调用前将清除 OLE Error Info 对象。但是,只有当提供者产生新的错误或 Clear 方法被调用时,才能清空并充填 Connection 对象的 Errors 集合。某些属性和方法返回的警告以 Errors 集合中的 Error 对象的方式出现,但并不中止程序的执行。在调用 Recordset 对象的 Resync、UpdateBatch、或 CancelBatch 方法,或 Connection 对象的 Open 方法,或者在设置 Recordset 对象的 Filter 属性之前,可通过调用 Errors 集合的 Clear 方法。这样就可以读取 Errors 集合的 Count 属性,以测试返回的警告。
      

  8.   

    如果需要更多这方面的信息,可以在您的硬盘上搜索ado210.chm这个文件
      

  9.   

    当sql = " insert into 。" Conn.Execute sql, N1 出现错误的时候,
    系统执行的是On Error GoTo Sub2Err,所以直接跳到了Sub2Err:
    程序中没有执行到Conn.BeginTrans这一步。
      

  10.   

    你5楼的处理方式有问题的....
    执行Conn.BeginTrans事务起动,回滚是针对执行成功的操作而言,如果这个事务中的第一个语句出错没有执行成功,那么整个事务就没有要回滚的操作,这种情况下当你的代码跳到了SUB2ERR处,这时因为启动了事务Conn.BeginTrans=1所以会执行Conn.RollbackTrans这一行,这样因为没有要回滚的数据,程序就出错了.....
    借你的代码,你可以先给N1赋值个负数,然后在第一个处理语句由N1返回操作所影响的行数,根据n1是否大于或等于0来处理回滚:
    Conn.RollbackTrans
    N1=-1
    sql="......"
    Conn.Execute sql, N1
    sql="......"   
    Conn.Execute sql
    sql="......"
    Conn.Execute sql
    ......Sub2Err:
    If N1>=0 Then Conn.RollbackTrans
    MsgBox Err.Description