用的的C#2.0+Acess,需要在递归函数里实现事务,程序不出错,但是结果确经常不一样(源数据不变,目的是递归统计并保存到另一张表),跟踪调试时明明看到语句执行了,可递归几次后提交事务,结果有时候却显示那个语句没执行,时好时坏

解决方案 »

  1.   

    jet 4,也就是2000以上支持事务处理 在Access中,用ADO或DAO打开记录集之后,就可以开始事务beginTransSQL语句commitTrans在beginTrans与commitTrans之间的所有语句,只要有一句执行失败,所有已执行的语句都会不生效。这种常用在同时操作几个表的情况下使用,以免造成数据有关联的几个表的数据不相符。事务用一句话来概括就是:全有或全无;要么全部生效,要么全部不生效。Public Sub BeginTransX()   Dim cnn1 As ADODB.Connection   Dim rstTitles As ADODB.Recordset   Dim strCnn As String   Dim strTitle As String   Dim strMessage As String   ' 打开连接。   Set strcnn=currentproject.connection   Set cnn1 = New ADODB.Connection   cnn1.Open strCnn   ' 打开 Titles 表。   Set rstTitles = New ADODB.Recordset   rstTitles.CursorType = adOpenDynamic   rstTitles.LockType = adLockPessimistic   rstTitles.Open "titles", cnn1, , , adCmdTable     rstTitles.MoveFirst    '开始事务   cnn1.BeginTrans   ' 在记录集中循环并询问是否想要更改指定标题的类型。   Do Until rstTitles.EOF      If Trim(rstTitles!Type) = "psychology" Then         strTitle = rstTitles!Title         strMessage = "Title: " & strTitle & vbCr & _         "Change type to self help?"         ' 更改指定雇员的标题。         If MsgBox(strMessage, vbYesNo) = vbYes Then            rstTitles!Type = "self_help"            rstTitles.Update         End If      End If         rstTitles.MoveNext   Loop   ' 询问用户是否想提交以上所做的全部更改。   If MsgBox("Save all changes?", vbYesNo) = vbYes Then      '如果回答是,就结束事务      cnn1.CommitTrans   Else     '如果回答否,就回滚事务,取消所有操作      cnn1.RollbackTrans   End If   rstTitles.Close   cnn1.CloseEnd Sub   关于JET SQL 事务处理的一个简单说明ms jet sql 从access2000开始支持开始和终止事务处理(提交和回滚)。要注意的是和 ANSI SQL 用 COMMIT 或者 ROLLBACK 不同,JET SQL 采用自己的事务标志,因为 JET SQL 不会自动开始事务处理(不支持隐性事务处理)。开始一个事务处理:BEGIN TRANSACTION                结束并提交一个事务处理:COMMIT或者COMMIT TRANSACTION               结束并取消修改,回滚ROLLBACK或者ROLLBACK TRANSACTION