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