更新记录有298条记录,一起提交出错,更新记录少时保存成功,难到缓存更新记录有记录数限制。

解决方案 »

  1.   

    感到delphi人气真不行,真是穷途未路吗?
      

  2.   

    主键已设,我想知道'TOO many record on table ,too many open tables '错误准确含义,如何解决?
      

  3.   

    to lee577
    是啊!我提交记录有298条,没有保存,请问缓存更新记录有记录数限制吗?
      

  4.   

    下面是一段delphi程序的框架,大致说明了如何运用缓存更新的编程模式
    unit Order;
    {单元名称}
    interface
    uses
    {引用的模块}
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, Grids, DBGrids, ExtCtrls, DBCtrls, ToolWin, ActnMan, ActnCtrls,
    ActnMenus, DB, DBTables;Type
    {声明的变量、添加的控件以及定义的方法和过程}
     TOrderForm = class(TForm)
     TBOrder: TTable;
     TBDetail: TTable;
     OrderDB: TDatabase;
     ActionMainMenuBar1: TActionMainMenuBar;
     DBNavigator1: TDBNavigator;
     DBGrid1: TDBGrid;
     procedure TBOrderAfterPost(DataSet: TDataSet);
     procedure TBDetailNewRecord(DataSet: TDataSet);
     procedure TBDetailUpdateRecord(DataSet: TDataSet;
     UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
     procedure TBDetailAfterPost(DataSet: TDataSet);
     procedure FormCreate(Sender: TObject);
     private
     { Private declarations }
      public
      { Public declarations }
      end;
     
     var
      OrderForm: TOrderForm;  implementation  {$R *.dfm}
      {下面的内容为主要的程序框架} procedure TOrderForm.FormCreate(Sender: TObject);
     {将主表与明细表的缓存更新选项设为true}
     begin
      TBOrder.CachedUpdates:=true;
      TBDetail.CachedUpdates:=true;
     end; procedure TOrderForm.TBOrderAfterPost(DataSet: TDataSet);
      {在提交Order表的更新后,执行本过程内容,本过程实现对主表和明细表的实际提交的事务。
       注意:如果一个数据集的cachedUpdates属性为true,
        那么post这个动作仅仅是在客户端缓冲区中进行一个提交动作,
        而不是真正的提交给实际的数据库。要实现真正的提交,
        需要用到applyUpdates语句。}
     begin
      OrderDB.StartTransaction;//更新事务开始执行
      try
       TBOrder.ApplyUpdates;//对主表进行实际的更新
       TBDetail.ApplyUpdates;//对明细表进行实际的更新
      except
       Orderdb.Rollback;//如果发生意外,那么回滚这个事务,退出该过程
       exit;
      end;
      OrderDB.Commit;//如果没有发生意外,那么完成事务提交
      TBOrder.commitUpdates;//清空TBOrder表的客户缓冲区
      TBDetail.commitUpdates;// 清空TBDetail表的客户缓冲区 end; procedure TOrderForm.TBDetailNewRecord(DataSet: TDataSet);
     {当新增一个明细表记录时所完成的动作。}
     begin
     TBDetail.FieldByName('OrderID').AsInteger:=TBOrder.FieldByName('OrderID').AsInteger;
     file://将主表的orderID字段赋给明细表的orderID字段,这个字段是两个表的关联字段 end;procedure TOrderForm.TBDetailUpdateRecord(DataSet: TDataSet;
     UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
     {当实际更新数据库表时,需要同时进行的操作在onUpdateRecord事件中定义,
      在本例当中是进行明细表和库存表的级联更新操作。
      注意:在本过程当中所进行的操作是在实际更新数据库时所进行的动作,
       而不是更新客户端的缓存数据时所进行的动作}
     Var temp_query:TQuery;
     begin
      if UpdateKind=ukInsert then file://如果更新类型是插入一个新的记录,那么更新相应的库存量
       with temp_query do
       begin
        close;
       SQL.clear;
       SQL.add('update storage set stocks=stocks-:amount');
       SQL.add(' where commondityID=:commondityID');
       paramByName('amount'):=TBOrder.FieldByName('amount').AsFloat;
       ParamByName('commondityID'):=TBDetai.FieldByName('commondityID').AsInteger;
       execSQL; file://执行更新库存的sql语句,将相应的库存量减去。
      end; end; procedure TOrderForm.TBDetailAfterPost(DataSet: TDataSet);
     {当对明细表的记录进行修改,并提交(post)之后,执行本过程中的语句。
      注意:这种提交是针对客户端数据的,并没有真正反映到数据库中去。
      在本例当中,实现的功能是计算主表的总金额字段}
     begin
      TBOrder.FieldByName('money'):=0;
      with TBDetail do
      begin
       first;
       while not eof do
       begin
        TBOrder.FieldByName('money'):=TBOrder.FieldByName('money')+
        FieldByName('price').AsFloat*FieldByName('amount');
        file://将明细表的金额累加到主表的金额字段
       next;
      end;
     end;end;end. 
      

  5.   

    谢谢 lee576
    绶存更新主细表我做过。我这里缓存是一个货品表goods.db ,是以在一种货品价格为基础打扣,修改其他价格,所以会同时修改多条记录,我发现修改记录多时会出现上面提示,保存不成功,修改记录少时,保存成功。所以我问你缓存更新记录有记录数限制吗?   
      

  6.   

    这里是保存程序
    if not data.Database1.InTransaction then
         begin
            data.Database1.StartTransaction;
             try
              query1.ApplyUpdates;
              data.database1.Commit;
               Application.MessageBox('Êý¾ÝÐ޸ijɹ¦','ËÄͨ¹ÜÀíϵͳ',MB_ICONINFORMATION);
             except
              Application.MessageBox('±£´æÊý¾Ý³ö´í','ËÄͨ¹ÜÀíϵͳ',MB_ICONINFORMATION);
                query1.CancelUpdates;            data.Database1.Rollback;
             raise;
             end;
             query1.CommitUpdates;      end;
      

  7.   

    事务能够被锁定和修改的记录数是有限的,Paradox限于255条记录,dBASE限于100条记录,sql不太清楚
      

  8.   

    谢谢 lee576
    我想应该有限制的,哪我只能用sql语句,直通更新了。