odac5.7 + Delphi7 + Oracle92使用有如下二个问题请教:
1: 用oraQuery组件,是否只有设置oraquery.localupdate := true才可以编辑?如果没设置这属性为真,我在oraquery.edit的时候就是提示该数据集为只读,而事实上我没有设置它人只读属性!
2:如果设置localupdate := true后,我编辑了数据,在提交的时候:oraquery.updaterecord;
oraquery.commit;
Grid数据显示是没错,但我退出窗体重新进入,刚才的数据事实上并没有保存到后台数据库中?这是什么原因?还有其他属性必须设置吗?

解决方案 »

  1.   

    第二个问题我知道原因了,应该是OraQuery.ApplyUpdate;
      

  2.   

    一般情况下,不要直接用Grid更新数据表
    oraquery.localupdate := true,只对本地更新,所以你要更新表中数据,这个参数只能为false
    要更新表中数据,可用用OraQuery 的SQL Generator(双击OraQuery可得到),生成Insert/Update/Delete的SQL(分别对应OraQuery的SQLInsert,SQLUpdate,SQLDelete属性)就可以对表进行操作了
      

  3.   

    也不至于吧,我不是在Grid中更新,是通过DBEdit类似的组件!我通过看ODAC5.7的例子CachUpdate,它的OraQuery是没设置localupdate,但它就是可以edit,奇怪,我设置的和它一样,为什么就一edit就说Dataset是readonly,不允许编辑?
      

  4.   

    你用DBEdit类似的组件,为什么不用SQL对表进行操作呢?
    用DBEdit/Grid直接连表并对表进行更新,在多用户时容易造成死锁,所以ODAC的OraQuery除SQL外,还有SQLInsert,SQLUpdate,SQLDelete等属性,且特意有VirtualTable控件,用它作为oracle数据表到dbgrid的中间桥梁
      

  5.   

    VirtualTable控件,用它作为oracle数据表到dbgrid的中间桥梁,,是什么意思?sqlinsert中的语句对于oraquery也是execute吗?
      

  6.   

    一般数据量的情况下,对oracle数据表用dbgrid编辑,可先将部分数据写入VirtualTable控件,添加/修改/删除在VirtualTable中进行,最后再回写到oracle数据表
    sqlinsert是odac特有的,也是为了在dbgrid编辑表用的,它不用execute(如果要用execute,直接在sql属性中写insert into ...就可以了),sqlinsert是用于当在dbgrid中添加记录时,自动生成insert ...SQL,并写到数据库表中,对SQLUpdate,SQLDelete同理