Delphi中使用TDataSetProvider和TClientDataSet协同工作,使用了一个内存中的表TClientDataSet可以非常好的实现前台的工作,中间零散的操作都可以保存在内存表中,等到工作基本结束,使用一个保存命令(界面上给用户的)通过事务一次性将所有的修改保存进远程的数据库,这样大大减少联系数据库的次数,提高了系统的效率,本人一直是这么做的,感觉非常好。
但是最近发现了一个比较的问题,那就是自增字段的存在,当为一个包含自增字段的表添加了数据,内存表中将不会对自增字段添加值,至少不会与将来保存到远程数据库以后的由数据库产生的值一致,难道这种表增加了新的数据就必须立刻保存到远程数据库吗?不保存就不能获得这个自增字段的ID了?立刻保存很大程度上破坏了上边说的使用TDataSetProvider和TClientDataSet协同工作带来的好处。
大家来帮忙啊,只要是合理的解决方法,或者告诉我没有办法必须保存,只要有个结论,我都将高分送上。

解决方案 »

  1.   

    自增字段,确实是不保存是没有值的。>>内存表中将不会对自增字段添加值,至少不会与将来保存到远程数据库以后的由数据库产生的值一致楼主说,这一个不一致~~~我想,如果这个自增值字段若是在别的表中用到,比如说是别的表的外键,那出现这个不一致的情况,绝对是不允许的。除了保存,还真没有别的更好的办法
      

  2.   

    使用clientdataset的好处是明显的不过对于自增ID这样的情况,clientdataset不保存也确实处理不了,以前见过别人用guid来解决,不过自己没试过
      

  3.   

    我想断电或者断网问题没有什么好说的,不保存是用户的事,Word文档丢失大家都还是习惯的,最多和 Word一样来个定时保存好了,但是这种事务与多次修改一次性提交的机制还是非常好的,要比每次都和远程数据库交流好多了。
      

  4.   

    如果真的必须保存,真的是很郁闷的事情,如果按楼上说的,不使用自增字段,那我想问一下,如何产生保证唯一的一个ID。
    -------------------------------------->
    使用CreateGUID(MYGUID); //生成GUID,这个绝对唯一
      

  5.   

    我就经常用Guid来解决ID主键问题,无须担心。顺便给你段代码,可以直接产生string类型的.function TMyApp.GetGuidKey: string;
    var
      MyGUID: TGUID;
    begin
      CreateGUID(MYGUID); //生成GUID
      Result := GUIDToString(MYGUID); //转换成String
      while Pos('-', Result) > 0 do
      begin
        Delete(Result, Pos('-', Result), 1); //去除'-'括号
      end;
      while Pos('{', Result) > 0 do
      begin
        Delete(Result, Pos('{', Result), 1); //去除左括号
      end;
      while Pos('}', Result) > 0 do
      begin
        Delete(Result, Pos('}', Result), 1); //去除右括号
      end;
    end;