接触Delphi 有一段时间了,丛接触delphi到数据库,一直都是塞入到数据库后显示在Dbgrid中,之前在java和c#中有临时的一个数据集合做为临时存储,比如举例来说,业务逻辑中有这么一个需求,单据表和单据的明细表,很明显是一对多的关系,明细在delphi处理是每一条都是塞入到数据库中,然后显示,多条明细就是多条塞入然后查出来显示。我的问题是,是否能和java或者c#一样有一个临时存储的地方,当保存或者提交单据的时候,再将数据塞入到数据库中,这样可以节省数据库访问的次数,可能有人会告诉我用临时表,就是将数据中建立临时表。但是会在数据库的访问上带来负担。频繁访问数据库对数据库和服务器有一定的压力。我不知道我的表达能发让各位大哥大姐明白!   跪求解决我的疑问。

解决方案 »

  1.   

    使用数据集TDataSet作为临时表。
      

  2.   

    一般用TClientDataSet仿MemTable来处理。
      

  3.   

    使用TClientDataSet组件,将数据存入TClientDataSet,验证后在存入数据库,TClientDataSet类似缓冲的道理
      

  4.   

    这位大哥,帮人帮到家,送佛送到家,能详细的说明一下使用方法吗?  我初来乍到,不太懂。
    type
      TMemTable = class(TClientDataSet)
      public
        procedure Fill(aDataset: TDataSet);
        function Open: Boolean; reintroduce;
      end;
    implementation{ TMemTable }procedure TMemTable.Fill(aDataset: TDataSet);
    var
      I: Integer;
    begin
      if Active then
        Close;
      FieldDefs.Assign(aDataset.FieldDefs);
      Open;
      aDataset.First;
      while not aDataset.Eof do
      begin
        Append;
        try
          for I := 0 to Fields.Count - 1 do
            Fields[I].Value := aDataset.Fields[I].Value;
        finally
          Post;
        end;
        aDataset.Next;
      end;
    end;function TMemTable.Open: Boolean;
    begin
      CreateDataSet;
      Result := Active;
    end;{
        FMemTable := TMemTable.Create(FQuery);    或    FMemTable := TMemTable.Create(nil);
        FMemTable.Fill(FQuery);    或    FMemTable := TMemTable.Create(nil);
        FMemTable.FieldDefs.Add('ID', ftInteger, 0, False);
        FMemTable.FieldDefs.Add('Status', ftString, 10, False);
        FMemTable.FieldDefs.Add('Created', ftDate, 0, False);
        FMemTable.FieldDefs.Add('Volume', ftFloat, 0, False);    FMemTable.Open;
        for I := 1 to 100 do
        begin
          FMemTable.Append;
          FMemTable.FieldByName('ID').AsInteger := I;
          FMemTable.FieldByName('Status').AsString := 'Code' + IntToStr(I);
          FMemTable.FieldByName('Created').AsDateTime := Date();
          FMemTable.FieldByName('Volume').AsFloat := Random(10000);
          FMemTable.Post;
        end;
      }
      

  5.   

    有那位打给能给写Demo   不胜感谢。
      

  6.   

    这位大哥,帮人帮到家,送佛送到家,能详细的说明一下使用方法吗?  我初来乍到,不太懂。
    type
      TMemTable = class(TClientDataSet)
      public
        procedure Fill(aDataset: TDataSet);
        function Open: Boolean; reintroduce;
      end;
    implementation{ TMemTable }procedure TMemTable.Fill(aDataset: TDataSet);
    var
      I: Integer;
    begin
      if Active then
        Close;
      FieldDefs.Assign(aDataset.FieldDefs);
      Open;
      aDataset.First;
      while not aDataset.Eof do
      begin
        Append;
        try
          for I := 0 to Fields.Count - 1 do
            Fields[I].Value := aDataset.Fields[I].Value;
        finally
          Post;
        end;
        aDataset.Next;
      end;
    end;function TMemTable.Open: Boolean;
    begin
      CreateDataSet;
      Result := Active;
    end;{
        FMemTable := TMemTable.Create(FQuery);    或    FMemTable := TMemTable.Create(nil);
        FMemTable.Fill(FQuery);    或    FMemTable := TMemTable.Create(nil);
        FMemTable.FieldDefs.Add('ID', ftInteger, 0, False);
        FMemTable.FieldDefs.Add('Status', ftString, 10, False);
        FMemTable.FieldDefs.Add('Created', ftDate, 0, False);
        FMemTable.FieldDefs.Add('Volume', ftFloat, 0, False);    FMemTable.Open;
        for I := 1 to 100 do
        begin
          FMemTable.Append;
          FMemTable.FieldByName('ID').AsInteger := I;
          FMemTable.FieldByName('Status').AsString := 'Code' + IntToStr(I);
          FMemTable.FieldByName('Created').AsDateTime := Date();
          FMemTable.FieldByName('Volume').AsFloat := Random(10000);
          FMemTable.Post;
        end;
      }大哥没看懂。
      

  7.   

    这位大哥,帮人帮到家,送佛送到家,能详细的说明一下使用方法吗?  我初来乍到,不太懂。
    type
      TMemTable = class(TClientDataSet)
      public
        procedure Fill(aDataset: TDataSet);
        function Open: Boolean; reintroduce;
      end;
    implementation{ TMemTable }procedure TMemTable.Fill(aDataset: TDataSet);
    var
      I: Integer;
    begin
      if Active then
        Close;
      FieldDefs.Assign(aDataset.FieldDefs);
      Open;
      aDataset.First;
      while not aDataset.Eof do
      begin
        Append;
        try
          for I := 0 to Fields.Count - 1 do
            Fields[I].Value := aDataset.Fields[I].Value;
        finally
          Post;
        end;
        aDataset.Next;
      end;
    end;function TMemTable.Open: Boolean;
    begin
      CreateDataSet;
      Result := Active;
    end;{
        FMemTable := TMemTable.Create(FQuery);    或    FMemTable := TMemTable.Create(nil);
        FMemTable.Fill(FQuery);    或    FMemTable := TMemTable.Create(nil);
        FMemTable.FieldDefs.Add('ID', ftInteger, 0, False);
        FMemTable.FieldDefs.Add('Status', ftString, 10, False);
        FMemTable.FieldDefs.Add('Created', ftDate, 0, False);
        FMemTable.FieldDefs.Add('Volume', ftFloat, 0, False);    FMemTable.Open;
        for I := 1 to 100 do
        begin
          FMemTable.Append;
          FMemTable.FieldByName('ID').AsInteger := I;
          FMemTable.FieldByName('Status').AsString := 'Code' + IntToStr(I);
          FMemTable.FieldByName('Created').AsDateTime := Date();
          FMemTable.FieldByName('Volume').AsFloat := Random(10000);
          FMemTable.Post;
        end;
      }大哥能否给写一个Demo呢!  
      

  8.   

    晕,我给了三个Demo:Demo1:    FMemTable := TMemTable.Create(FQuery);Demo2:    FMemTable := TMemTable.Create(nil);
        FMemTable.Fill(FQuery);Demo3:    FMemTable := TMemTable.Create(nil);
        FMemTable.FieldDefs.Add('ID', ftInteger, 0, False);
        FMemTable.FieldDefs.Add('Status', ftString, 10, False);
        FMemTable.FieldDefs.Add('Created', ftDate, 0, False);
        FMemTable.FieldDefs.Add('Volume', ftFloat, 0, False);    FMemTable.Open;
        for I := 1 to 100 do
        begin
          FMemTable.Append;
          FMemTable.FieldByName('ID').AsInteger := I;
          FMemTable.FieldByName('Status').AsString := 'Code' + IntToStr(I);
          FMemTable.FieldByName('Created').AsDateTime := Date();
          FMemTable.FieldByName('Volume').AsFloat := Random(10000);
          FMemTable.Post;
        end;