(500分)请问ClientDataSet同DataSet之间如何传输数据,正确之后再给300分。(200分)

  • 主题发起人 主题发起人 ylbx
  • 开始时间 开始时间
Y

ylbx

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在正在做一个分布式数据库的数据异步复制程序,但是在ClientDataSet同
DataSet之间的数据交换是出现问题,问题很急。。。
 
我不明白先了
TClientDataSet就是TDataSet的继承类。
你如果什么地方需要使用TDataSet,还需要进行数据交换???
是否可以先说清楚?
 
你说的意思是不是:
客户短的数据如何于复制到服务器上。《同步??异步??、?》
我觉得你在将数据提交到客户端数据库时,同时将数据提交到服务器端,这样可以
减少程序的负担,又可以加快数据的更新。
我们做程序一般是要求:数据的同步复制。
 
实际情况是:
在应用服务器端(使用CORBA)连接到中心数据库,这样中心数据中的TDataSet就变成
TClientDataSet,由于应用服务器的客户端安装在分部数据库的同一个局域网里,于是得到
的分部数据库的数据就是TDataSet。
而我要做的就是让中心数据库中的数据同步于分部数据库。于是反映出来的问题就是在
ClientDataSet同DataSet之间如何传输数据。
 
lcd:
其实在我们软件系统运行于一个广域网里,关键数据就在系统里面使用总部数据库中的
数据,有的不太关键的数据就在网络空闲的时候进行异步复制,现在系统的设计已经快结
束了,留下的比较麻烦的问题就是数据异步复制。
 
ClientDataSet同DataSet都是TdataSet:
使用TdatasetA.field.getdata 以及 TdatasetB.field.setdata
源代码如下:

Procedure RecordBatchMove(Source,Dest:TDataSet);//将源数据集的当前记录拷贝到目的数据集当前记录(目的数据集可写)
{ 目的:将源数据集中的数据更新拷贝(相当于BatchMove的AppendUpdate)到目标数据集;
前提条件:1、源数据集和目标数据集中的记录已经定位
2、目的数据集可写
工作原理:1、将源数据集(Source)中的数据定位到目标记录.
2、将目标数据集定位到相关记录:
2-1、在目标数据集删除相应的记录,
2-2、在目标数据集增加一条记录。
3、从源数据集中取出相关的记录。
4、遍历源数据集当前记录中的数据字段。
4-1、判断源数据集中当前数据字段的数据类型。
4-2、寻找目的数据集中的相关字段并将数据拷贝进入。
5、提交目的数据集。
}
const
FieldTypeNames: array[TFieldType] of string = (
'Unknown', 'String', 'SmallInt', 'Integer', 'Word', 'Boolean', 'Float',
'Currency', 'BCD', 'Date', 'Time', 'DateTime', 'Bytes', 'VarBytes',
'AutoInc', 'Blob', 'Memo', 'Graphic', 'FmtMemo', 'ParadoxOle',
'dBaseOle', 'TypedBinary', 'Cursor', 'FixedChar', 'WideString',
'LargeInt', 'ADT', 'Array', 'Reference', 'DataSet', 'OraBlob', 'OraClob',
'Variant', 'Interface', 'Dispatch', 'Guid');
var
stream:TMemoryStream;
i,MemSize:integer;
mybuffer:Pointer;
Begin
with Source do
begin
stream :=TMemoryStream.Create;
for i:=0 to Source.FieldDefs.Count-1 do

begin //判断数据字段的类型
if not Source.Fields.IsNull then
begin
if Source.Fields.DataType in [ftMemo] then //ftMemo
begin
stream.Clear;
((Source.Fields) as TMemoField).savetostream(stream);
stream.Position :=0;
((Dest.FieldByName(Source.Fields.FieldName)) as TMemoField).LoadFromStream(stream );
end
else if Source.Fields.DataType in [ftBlob] then //ftBlob
begin
stream.Clear;
((Source.Fields) as TBlobField).savetostream(stream);
stream.Position :=0;
((Dest.FieldByName(Source.Fields.FieldName)) as TBlobField).LoadFromStream(stream );
end
else if Source.Fields.DataType in [ftGraphic] then //ftGraphic
begin
stream.Clear;
((Source.Fields) as TGraphicField).savetostream(stream);
stream.Position :=0;
((Dest.FieldByName(Source.Fields.FieldName)) as TGraphicField).LoadFromStream(stream );
end
else//。。。。。。。。。。。。。。。。。。。。。。 其它任何字段类型
begin
MemSize:=Source.Fields.DataSize; //初始化内存。
GetMem(mybuffer,MemSize);
Source.Fields.GetData(mybuffer);
(Dest.FieldByName(Source.Fields.FieldName)).SetData(mybuffer);
FreeMem(mybuffer);
end;
end
else
Dest.FieldByName(Source.Fields.FieldName).Clear;
end; //判断数据字段的类型
stream.Free;
end;
end;
 
接受答案了.
 
TclientDataset有一种公文包模式,符不符合你的要求?
(Delphi的Demos中有例子)
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部