大数据库都支持commit这个sql语句,你在回滚后最好执行一下commit
如果没有commit,则你的回滚命令只是在内存中,(回滚段中而没有写入到数据文件,这时你新加当然要出错了)
Oracle好像是3秒自动写一次数据文件,如果你赶的不好,正好在3秒内写入我想出错是必然的。这个写入时间不是一定的,如果数据处理量比较大这个时间还可能增加的。

解决方案 »

  1.   

    chsl918(二雷):
    你的办法不行,你指的是数据库的事务处理,我这里讲的是Ado的事务处理
    如果dim cn as adodb.connection
    ....
    cn.BeginTrans '事物开始
    ....
    cn.CommitTrans  '提交
    ....
    cn.RollbackTrans  '回滚如果RollbackTrans 后再CommitTrans,程序就出错了(实时错误,没有活动事务)数据库中的数据是被正常回滚了,但是Recordset中却不能识别被回滚的数据
    如果重新open的话,也就把用户添加的数据给丢了是否能够把RecordSet在同步数据库前保存起来,失败后再赋值回去?
    我用过这样的方法:dim adoRsTmp as adodb.recordsetset adoRsTmp = new adodb.recordset
    set adoRsTmp.activeconnection = cn  'cn是adodb.connection对象
    adoRsTmp.Open adoRs ' adoRs是实际的recordset对象,通过哦open方法使内存中保留两个RecordSet副本
    set adoRsTmp.Activeconnection = nothing '我的设想是断开数据库连接,使adoRsTmp保持同步前状态事务回滚后:
    set adoRs = adoRsTmp但实际上并备有起到我设想的效果,通过检查EditMode,发现adoRsTmp保持了AadoRs同样的状态,微软的数据感知技术似乎同步了adoRs和adoRsTmp,尽管我设置了adoRsTmp.Activeconnection = nothing。各位高手帮帮忙,给点意见!!
      

  2.   

    你说的这部分我还真的不是特别了解,但是我看到你说如果重新打开就会把用户添加的数据给丢了。
    我想可不可以在保存前,将用户添加的数据保存在数组中,如果就一条数据也可以干脆把SQL语句保存下来,然后在重新打开数据库重新对数据库进行写操作啊!
    你说两个ADORs同步了,那么一个内存中的数组不会和ADORs同步吧?
    当然了以上是我片面的想法实际的实现可能有一些其他的困难,但是我想如果数据量不是上百做成数组存放起来还是可以的。
      

  3.   

    I think that u must use client cusor for connection.Connectin.location=adocliient
      

  4.   

    Bardo(巴顿):
    Connection对象没有location属性,如果你指的是CursorLocation的话,我现在用的正是client cusor