如何将clientdataset的data存到数据库中,而再从数据库中读出,赋给另一个Clientdataset中?(100)(100分)

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

lschun

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将clientdataset的data存到数据库中,而再从数据库中读出,赋给另一个Clientdataset中?(100)
源码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, Grids, DBGrids, DBClient;
type
TForm1 = class(TForm)
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
ClientDataSet2: TClientDataSet;
DataSource2: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
ClientDataSet2a: TStringField;
ClientDataSet2b: TBlobField;
BitBtn1: TBitBtn;
ClientDataSet3: TClientDataSet;
DataSource3: TDataSource;
DBGrid3: TDBGrid;
BitBtn2: TBitBtn;
ClientDataSet1trans_class: TStringField;
ClientDataSet1trans_id: TIntegerField;
ClientDataSet1msgtype: TStringField;
ClientDataSet1proccode: TStringField;
ClientDataSet1trans_name: TStringField;
ClientDataSet1bitmap_str: TStringField;
ClientDataSet1bitmap: TBlobField;
ClientDataSet1open_flag: TStringField;
ClientDataSet3trans_class: TStringField;
ClientDataSet3trans_id: TIntegerField;
ClientDataSet3msgtype: TStringField;
ClientDataSet3proccode: TStringField;
ClientDataSet3trans_name: TStringField;
ClientDataSet3bitmap_str: TStringField;
ClientDataSet3bitmap: TBlobField;
ClientDataSet3open_flag: TStringField;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
var mem:Tclientblobstream;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
//mem:=Tclientblobstream.Create;
mem:=tclientblobstream.Create(tblobfield(clientdataset2.FieldByName('b')),bmreadwrite);
clientdataset1.SaveToStream(mem,dfXML);
//clientdataset1.SaveToFile('a.txt',dfXML);
clientdataset2.Append;
tblobfield(clientdataset2.FieldByName('b')).LoadFromStream(mem);
// :=clientdataset1.Data;
clientdataset2.post;
tblobfield(clientdataset2.FieldByName('b')).SaveToFile('b.txt');
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var gg:Tstream;
begin
gg:=tmemorystream.Create;
gg:=mem;
// tblobfield(clientdataset2.FieldByName('b')).savetostream(gg);
clientdataset3.LoadFromStream(mem);//**至此系统报错:missingdata provider or data package
// clientdataset3.LoadFromFile('b.txt');
// savetostream
end;
end.
请大家帮忙,试一下。[:(!][:(!]
 
这可能是delphi的bug.
 
cliendataset1.savetofile()是保存clientdataset1.delta而不是data
如果clientdataset2要读入的话:clientdataset2.loadform()就行了嘛,何必这样!
 
要把一个cds的Data赋值给另一个cds,只要
cds1.Data := cds2.Data;
就可以了。
如果要存入到数据库中,可以用另一个中介的cds,将要保存的cds的Data作为TBlobField
字段的值保存;取数据只要反过来就可以了。
To:天真
cds的SaveToFile保存的是Data,不仅仅是Delta。
 
movingboy2兄:好象是我忘了,我记得DELTA包括了DATA,他是DATA+被修改值吧!
 
天真, Delta不包括DATA.
如果一个ClientDataSet没有被更改,它的Delta值为nil
 
错了,SaveToFile的是Data,而没有Delta,如果你要保存Delta的话,你要把Delta
赋值到一个新的ClientDataSet的Data属性里面,然后再用这个ClientDataSet的
SaveToFile才可以。。。。
读出来的顺序则相反。。。[:)]
 
如果你要保存Data+Delta的话,使用 CDS.MergeChangeLog ;
CDS.SaveToFile 也可以
 
to movingboy2:我贴出上例的源码只是想说明要解决一个需求:我实时地将系统的一些数据存入数据库中,待我高兴时取出来浏览一下数据,取数时可能都已经是数据发生一个月以后的事情了。
to 天真:有关DATA和DELTA的关系,没有必要争论,看一看DELPHI的帮助就全清楚了,你的概念有问题。
感谢大家的参与,请大家继续参与。
 
后退
顶部