100大圆求购:怎样对建立在内存中的临时表进行操作?(100分)

  • 主题发起人 主题发起人 liuaono1
  • 开始时间 开始时间
L

liuaono1

Unregistered / Unconfirmed
GUEST, unregistred user!
请各位大虾指点:
1.怎样在内存中建立一个临时表?
2.怎样对建立在内存中的临时表进行插入、修改操作?
(本人特菜,还望大虾赐一实例!)
 
你可以用TClientDataSet
用下面的例子可以动态筹建一个clientdataset.你对他可以同一般的DataSet一样操作。

procedure TForm1.Button1Click(Sender: TObject);
begin
with MasterCDS.FieldDefs do
begin
Add('FIRST_NAME',ftString,20,False);
Add('LAST_NAME',ftString,20,False);
MasterCDS.CreateDataSet;
end;
 
我用TClientDataSet创建过,但用 Query 给其添入数据时却出现错误,
提示指出当前路径下无此表,怎样才能让它知道这表是建立在内存中呢?

<:-<<
 
给你一个例子,
Query1.sql.text为 select * from table1;
如过你想把Query1中的数据放到内存表(TClientDataSet)中
可以这么做:

1.把query1打开,加一个TDataSetProvider: DataSetProvider1,它的dataset属性设置为query1
2.加一个TClientDataset: ClientDataSet1,他的Provider属性设置为DataSetProvider1
3.双击ClientDataSet1,在字段编辑器中加入所有字段。
4.删除DataSetProvider1
ok,现在就可以开始写代码了:
我这里有一个现成的procedrue我想你改造一下就可以用了
procedure AddCBDYDataSet(const ASourceDataSet: TDataSet;
ACBDYDataSet: TClientDataDataSet);
var
bm: string;
i: Integer;
DYField: TField;
begin
Assert(ASourceDataSet.Active);
ACBDYDataSet.Close;
ACBDYDataSet.CreateDataSet;
ASourceDataSet.DisableControls;
try
bm := ASourceDataSet.Bookmark;
try
ASourceDataSet.First;
while not ASourceDataSet.Eof do
begin
ACBDYDataSet.Insert;
for i := 0 to ASourceDataSet.FieldCount - 1 do
begin
DYField := ACBDYDataSet.FindField(ASourceDataSet.Fields.FieldName);
if Assigned(DYField) and (DYField.FieldKind = fkData) then
DYField.Value := ASourceDataSet.Fields.Value;
end;
ACBDYDataSet.Post;
ASourceDataSet.Next;
end;
finally
ASourceDataSet.BookMark := bm;
end;
finally
ASourceDataSet.EnableControls;
end;
end;
调用:
Query1.Open;
AddCBDYDataSet(Query1, ClientDataSet)
就可以了。

 
我知道你的问题:我也遇过同样的问题
TClientDataSet不支持SQL语言。
想直接操纵 update... 不可以。
可以试一下lighthong的办法
或者按 BUG 问题检索一下
 
creat view as ...
 
query,clientdataset均可以动态创建
也可以重ADOquery 得到不过得注意DataType

如果不动结构和数据:
TmpClientDataSet:=TClientDataSet.create;
TmpQuery:=TQuery.create;
TmpQuery.sql.add('select...');
Tmpquery.open;
TmpclentDataSet.data:=TmpQuery.Get_data;
TmpQuery.free;
....

***********************
如果要修改数据和结构如下比较复杂,给一个过滤多对多查重例子:
第一步按Query创将TClientDataSet的结构
TmpClientDataSet:=TClientDataSet.create;
TmpQuery:=TQuery.create;
with TmpClientDataSet do
begin
for i:= 0 to TmpQuery.fieldcount -1 do
begin
if (TmpQuery.fields.datatype = ftstring) or
(TmpQuery.fields.datatype = widestring)
then fielddefs.add(TmpQuery.fields.fieldname,
TmpQuery.fields.datatype,TmpQuery.fields.size,False)
else if TmpQuery.Fields.DataType = ftAutoInc then
fielddefs.add(TmpQuery.fields.fieldname,ftInteger,0,False)
else fielddefs.add(TmpQuery.fields.fieldname,TmpQuery.fields.datatype,0,False);
end;
TmpClientDataSet.createdataset;
end;

第二步过滤数据并给TClientDataSet付值
with TmpQuery do
begin
first;
SetLength(ADDValues, fieldcount );
KeyValues:= FieldValues[keyFieldname.name];
for i:=0 to fieldcount -1 do
ADDValues:= fields.AsVariant;
next;
while not eof do
begin
if KeyValues = FieldValues[keyFieldname.name] then
begin
for p:=0 to k-1 do

if Pos(FieldValues[ADDFieldname[p].name],ADDValues[ADDFieldname[p].index]) <= 0 then
ADDValues[ADDFieldname[p].index]:=ADDValues[ADDFieldname[p].index]+ FieldValues[ADDFieldname[p].name];

end else
begin
TmpClientDataSet.append;
for i:= 0 to TmpClientDataSet.fieldcount -1 do TmpClientDataSet.fields.AsVariant:= ADDValues;
for i:=0 to fieldcount -1 do ADDValues:= fields.AsVariant;
KeyValues:= FieldValues[keyFieldname.name];
end;
next;
end;
TmpClientDataSet.append;
for i:= 0 to TmpClientDataSet.fieldcount -1 do TmpClientDataSet.fields.AsVariant:= ADDValues;
result:=TmpClientDataSet.Data;
TmpClientDataSet.Free;
end;
end;
 
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=233039
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部