IBTable1 通过 IBTransaction1 连接 IBDatabase1,并使用dbgrid在屏幕显示
IBQuery1 通过 IBTransaction2 也连接 IBDatabase1
使用 IBQuery1 insert 一条记录,并且commit,
此时,使用sql explorer 可以看到新记录
但 IBTable1.locate 查不到新记录,而且dbgird中也没有新记录

解决方案 »

  1.   

    可以试试将IBTransaction1.active:=false;然后再打开ibtable1。
    为什么要用两个IBTransaction呢?
      

  2.   

    IBtable1是使用在客户端buffer中的资料工作, 而ibquery1所新加入的纪录, 是不可以即时在ibTable1中所反映.
      

  3.   

    interbase HLP中建议每一个sql单独使用一个IBTransaction。
    如何解决?
      

  4.   

    改变 IBTransaction 级别(鼠标双击)改变成 read committedBTW: 你的问题点数有意思,怎么是 92 点?~
      

  5.   

    将IBTransaction1.active:=false;然后再打开ibtable1。这样是可以的。
    interbase HLP中建议每一个sql单独使用一个IBTransaction?
    能否将原话show出来?
      

  6.   

    这里有两个要说明:
    一、IBTable1.locate 方法并不造成与服务器连接重新获取数据,它只是在客户端已有的结果集中查找记录。
    二、默认情况下 IBTransaction 采用“快照”事务隔离级别。这种级别对于多版本方式的数据库很具有优势。但,它只能对“快照”出在它之前的事务情况,不能反应在它之后开始的事务情况。所以,你有两种解决办法:1、让你的查询事务始终出于你程序中的最后一个开始的事务;2、改变查询事务事务隔离级别,如我上面说的那样。
      

  7.   

    CuteBit说得对。你有两种方法,一个是将Trans1显式Commit,然后重新开始一个新的;另一个是将Trans1的事务隔离级别设置为ReadCommit。你描述的情况在IB中是很正常的。因为IB支持最高级别的事务处理:Repeatable Read,又称Serializable Read。另外,我没有看到过IB文档中哪里有声明一个SQL用一个事务的语句。