本人初次做程序,有关保存机制麻烦赐教。为了将问题说清楚,话可能会多,但是问题一定很简单。问题如下:
我想做一个记录每天消费情况的软件,数据库XF表有几千条数据,每天的消费情况是一条数据,包括日期和当天消费两个字段。打开程序自动读取XF表所有数据,左边是目录树,显示的是年份,月份。在左面目录单击某一个月份,右面列表显示当前月每天的消费数据。现在有这样一个问题,就是比如我在左面目录选择了1月,右面1月2号做了修改,又在左面选择了2月,又在右面2月5号做了修改,选择保存时则修改数据库中1月2号和2月5号两条记录,选择不保存时就全不保存。这个应该怎么实现啊?我的思路是每次打开软件就把XF表中的数据复制到一个临时表比如叫XFLSB的表中,每次在程序中修改时就修改XFLSB中的数据,如果最后选择保存就把XF表中数据清空,再将XFLSB中的数据全部复制到XF表中,但是我觉得这种保存方法不好,因为好几千条数据我只改了两条,却要先删除再复制好几千条,是不是太罗嗦呢?而且好几条数据复制也需要一会时间呢。所以我想就不以循环方式逐条复制数据,直接把XFLSB表复制一下以XF名保存替换掉原来的XF表是不是快好多呢?不知道我这种保存方法好不好,不知道各位高手对于这种类似情况用什么保存方式?如果我的保存方法可取,请告诉我复制,删除,保存ACCESS数据库表的代码怎么写,我网上没找到。比如肯定要先删除XF表,再复制XFLSB表,再以XF名字保存表,这三句代码怎么写?数据库是ACCESS数据库,用ADOConnection1连接的数据库,ADOQuery1,ADOQuery2,ADOQuery3连接表。如果不可取,却能够提供一种好用,快捷的保存方法!!!谢了哦
只能给100分?

解决方案 »

  1.   

    没那么麻烦,你直接在一个按钮中写多个保存就可以了。
    也可以使用Batchupdate是比比较好的选择。
      

  2.   

    把ADOQuery的LockType设置成ltBatchOptimistic
      

  3.   

    如果用UpdateBatch处理的话,可以这样:(假设你修改的是ADOQuery1的数据)
      //打开数据集ADOQuery1后执行如下代码:
      ADOQuery1.CursorType:=ctKeySet;
      ADOQuery1.LockType:=ltBatchOptimistic;  //保存数据时执行如下代码:
      ADOQuery1.UpdateBatch(arAll);  //不需要保存数据时执行如下代码
      ADOQuery1.CancelBatch(arAll);
      

  4.   

    如果使用事务处理的话,可以像这样:
      //打开数据集ADOQuery1后执行如下代码:
      ADOQuery1.Connection.BeginTrans;  //保存数据时执行如下代码:
      ADOQuery1.Connection.CommitTrans;  //不需要保存数据时执行如下代码
      ADOQuery1.Connection.RollbackTrans;
      

  5.   

    有点晕,
    直接按日期
    update xxx set xxx=xxx where 日期=xxx
    改几条保存几条不行吗?
      

  6.   

    按你这样是罗嗦了点效率还很低,把我的想法和你说说,首先你建立一结构
    type 
       PXF = ^TXF;
       TXF = packed record
         rq:TDateTime;
         xfje:integer;
       end; 
    pxf1:PXF;
    然后定义一链表
    xfList:TList;
    如果你修改数据就用下面语句(变量名自己定)
    pxf1.rq:=rq;
    pxf1.xfje:=xfje;
    保存进链表
    xfList.item.add(pxf1);
    如果保存就遍历链表
    for i:=0 to xfList.count-1 do
      //保存进数据库
      //更新语句 'update XF set RQ=''' + datetimetostr(pxf1.rq)+ ''',xfje=' + inttostr(pxf1.xfje) + ' where RQ=''' + + datetimetostr(pxf1.rq)+ ''''
    你试试吧
      

  7.   

    事务我还没接触过呢,不过如果只需要这三行代码的话,我还是明白的。我就是不明白该写在上面地方。
    我的ADOquery1.update语句是写在表格控件的edited事件上的,如果我编辑过好多条数据,那么这个edited事件肯定要调用好多次的。而按你所说,ADOQuery1.Connection.CommitTrans和ADOQuery1.Connection.RollbackTrans;
    语句要写在是否保存窗口的“是”和“否”按钮的单击事件中,这样行吗?
      

  8.   

     “试着不先使用BeginTrans 而提交或退回事务 ”错误怎么办?