我现在做了个程序,需要向数据库中作添加、删除、更改的操作!
现在需要做事务回滚处理,在对数据库进行操作之前加上了“Conn400.BeginTrans”其中“Conn400”是一个CONNECTION,和一个如果正确处理了就可以“Conn400.CommitTrans”;还有一个如果错误就“Conn400.RollbackTrans”;
可是,当数据处理遇到错误后程序能正确的运行“Conn400.RollbackTrans”条语句,但到数据库中却发现它并没有被回滚;
因为,在程序处理数据库之前,数据库里没有数据是空的,当程序处理到了错误的数据后本应该做一个回滚操作的,但出现错误并执行了“Conn400.RollbackTrans”后数据库确有报错前被处理的记录!

解决方案 »

  1.   

    代码粘上来,给你写1个方法
    Public Function Exsql(ParamArray sql()) As Boolean
    '事务执行1个sql语句
       Dim cnConn As ADODB.Connection
       Set cnConn = New ADODB.Connection
        Dim mysql
        On Error GoTo err1   cnConn.Open CN
       cnConn.BeginTrans '开始一个事务
       
       For Each mysql In sql
            cnConn.Execute mysql
       Next
       cnConn.CommitTrans '提交一个事物
       
       Set cnConn = Nothing
       Exsql = True
       Exit Function
    err1:
        cnConn.RollbackTrans '回滚一个事物
        Exsql = False
    End Function
      

  2.   

    这是我的源代码:On Error GoTo ErrorLine  For tFor = 1 To ListTable
        DoEvents
        Set RecordSQL = New Recordset
        sSelectSQL = "Select * From " & sTableSQL
        Set RecordSQL = MyConn.Execute(SelectSQL)
        DoEvents
        RecordSQL.MoveFirst
        Set Record400 = New Recordset
        With Record400
          .CursorType = adOpenDynamic 'adOpenStatic
          .LockType = adLockPessimistic ' adLockOptimistic
          
          sSelect400 = "Select " & sTable400 & ".* From " & sTable400
          .Open sSelect400, Conn400
        End With    Conn400.BeginTrans
        DoEvents
        sMySelect = "Select * From FieldName Where TableName='" & sTableSQL & "'"
        Set MyRecord = MyConn.Execute(sMySelect)    Do While (Not (RecordSQL.EOF Or RecordSQL.BOF))
           DoEvents
           Record400.AddNew
           MyRecord.MoveFirst
           Do While (Not (MyRecord.EOF Or MyRecord.BOF))
              tFieldSQL = Trim(MyRecord("FieldName"))
              tField400 = Trim(MyRecord("RmtFName"))
              Record400(tField400) = RTrim(RecordSQL(tFieldSQL))
              MyRecord.MoveNext
           Loop
           Record400.Update
           RecordSQL.MoveNext
        Loop
        Conn400.CommitTrans
        Set RecordSQL = Nothing
        Set Record400 = Nothing
    NextRecord:
      NextExit FunctionErrorLine:  Select Case Err.Number
         Case Else
            Err.Clear
            Conn400.RollbackTrans
            GoTo NextRecord
      End Select
      Resume Next
    End Function
      

  3.   

    Record400.Update是一个隐式的提交,因此会滚不好用,
      

  4.   

    不要用addnew
    直接拼成sql语句 如"insert"
    然后调用我的方法
    dim sql as string,sqll as string
    sql="insert into aaa values('1','2')"
    sqll="insert into aaa values('4','3')"
    exsql(sql,sqll)
      

  5.   

    Public Function Exsql(ParamArray sql()) As Boolean
    '事务执行1个sql语句
       Dim cnConn As ADODB.Connection
       Set cnConn = New ADODB.Connection
        Dim mysql
        On Error GoTo err1   cnConn.Open CN
       cnConn.BeginTrans '开始一个事务
       
       For Each mysql In sql
            cnConn.Execute mysql
       Next
       cnConn.CommitTrans '提交一个事物
       
       Set cnConn = Nothing
       Exsql = True
       Exit Function
    err1:
        cnConn.RollbackTrans '回滚一个事物
        Exsql = False
    End Function
      

  6.   

    每个 Microsoft® SQL Server™ 2000 数据库都有一个事务日志记录数据库内的数据修改。日志记录每个事务的开始和结束并将每个修改与一个事务相关联。SQL Server 实例在日志中存储足够的信息以恢复(前滚)或撤消(回滚)构成事务的数据修改。日志中的每条记录都由一个唯一的日志序号 (LSN) 标识。事务的所有日志记录都链接在一起。
      

  7.   

    去掉On Error GoTo ErrorLine这行,检测出错地点.