实现功能如下:
从数据库中查询一些数据,如:select * from table where id<100
把这个结果压缩后存为一个文件。
相反的,从一个结果文件中读出数据,解压缩后,把数据导入到数据库中的表里。我的思路如下:
1、压缩导出文件过程:
procedure TForm1.Button1Click(Sender: TObject);
var ms1: TMemoryStream;
begin
ms1 := TMemoryStream.Create;
SimpleDataSet1.DataSet.CommandText:='select * from table where id<100';
SimpleDataSet1.Open;
SimpleDataSet1.SaveToStream(ms1); //把查询出的结果数据存入内存流ms1中
CompressStream(ms1); //把内存流ms1中的结果数据压缩(此为调用压缩过程)
ms1.SaveToFile('e:\KVOffice.log'); //把内存流ms1中的压缩后的数据存为文件
ms1.Free;
end;
2、解压缩出入数据库过程:
procedure TForm1.Button2Click(Sender: TObject);
var ms1: TMemoryStream;
begin
ms1 := TMemoryStream.Create;
ms1.LoadFromFile('e:\KVOffice.log'); //把文件中的数据加载到内存流ms1中
DecompressStream(ms1); //把内存流ms1中的结果数据解压缩(此为调用解压缩过程)
---------------------------------------
SimpleDataSet1.LoadFromStream(ms1); //把内存流ms1中的压缩后的数据导入simpledataset中
SimpleDataSet1.ApplyUpdates(0); //把simpledataset中数据写入数据库
---------------------------------------
ms1.Free;
end;以上程序压缩过程没问题,解压缩也没有问题。
问题出在解压缩过程的后两句上
---------------------------------------
SimpleDataSet1.LoadFromStream(ms1); //把内存流ms1中的压缩后的数据导入simpledataset中
SimpleDataSet1.ApplyUpdates(0); //把simpledataset中数据写入数据库
---------------------------------------问题1: SimpleDataSet1.LoadFromStream(ms1);无法从内存流ms1中导入数据。
并不报错,可导入后SimpleDataSet1显示的并不是导入的数据,而是DataSet.CommandText语句查出的数据。
我试过SimpleDataSet1.LoadFromFile('e:\query.txt');直接导入文件结果也不行。问题2: SimpleDataSet1.ApplyUpdates(0);如何把SimpleDataSet1.LoadFromStream(ms1)的数据写入数据库的表中?我试过所有的数据控件,实现以上功能,只有dbexpress最合适。
bde没有SaveToFile和SaveToStream功能。
ado有SaveToFile和LoadFromFile但是没有LoadFromStream功能,没有办法在Stream中处理压缩数据。
clientdataset有SaveToFile、LoadFromFile和LoadFromStream功能,但它是三层结构的,我用的是C/S结构。
clientdataset能不能LoadFromStream数据后,写回数据库我试过也没有成功!不知道哪位高手能帮忙解决以上问题,或提出其他可以实现以上功能的方法!!!另外,如能完美解决此问题,可以再加分! ^_^ ( 我第一次肯为一个问题加这么多分!)
从数据库中查询一些数据,如:select * from table where id<100
把这个结果压缩后存为一个文件。
相反的,从一个结果文件中读出数据,解压缩后,把数据导入到数据库中的表里。我的思路如下:
1、压缩导出文件过程:
procedure TForm1.Button1Click(Sender: TObject);
var ms1: TMemoryStream;
begin
ms1 := TMemoryStream.Create;
SimpleDataSet1.DataSet.CommandText:='select * from table where id<100';
SimpleDataSet1.Open;
SimpleDataSet1.SaveToStream(ms1); //把查询出的结果数据存入内存流ms1中
CompressStream(ms1); //把内存流ms1中的结果数据压缩(此为调用压缩过程)
ms1.SaveToFile('e:\KVOffice.log'); //把内存流ms1中的压缩后的数据存为文件
ms1.Free;
end;
2、解压缩出入数据库过程:
procedure TForm1.Button2Click(Sender: TObject);
var ms1: TMemoryStream;
begin
ms1 := TMemoryStream.Create;
ms1.LoadFromFile('e:\KVOffice.log'); //把文件中的数据加载到内存流ms1中
DecompressStream(ms1); //把内存流ms1中的结果数据解压缩(此为调用解压缩过程)
---------------------------------------
SimpleDataSet1.LoadFromStream(ms1); //把内存流ms1中的压缩后的数据导入simpledataset中
SimpleDataSet1.ApplyUpdates(0); //把simpledataset中数据写入数据库
---------------------------------------
ms1.Free;
end;以上程序压缩过程没问题,解压缩也没有问题。
问题出在解压缩过程的后两句上
---------------------------------------
SimpleDataSet1.LoadFromStream(ms1); //把内存流ms1中的压缩后的数据导入simpledataset中
SimpleDataSet1.ApplyUpdates(0); //把simpledataset中数据写入数据库
---------------------------------------问题1: SimpleDataSet1.LoadFromStream(ms1);无法从内存流ms1中导入数据。
并不报错,可导入后SimpleDataSet1显示的并不是导入的数据,而是DataSet.CommandText语句查出的数据。
我试过SimpleDataSet1.LoadFromFile('e:\query.txt');直接导入文件结果也不行。问题2: SimpleDataSet1.ApplyUpdates(0);如何把SimpleDataSet1.LoadFromStream(ms1)的数据写入数据库的表中?我试过所有的数据控件,实现以上功能,只有dbexpress最合适。
bde没有SaveToFile和SaveToStream功能。
ado有SaveToFile和LoadFromFile但是没有LoadFromStream功能,没有办法在Stream中处理压缩数据。
clientdataset有SaveToFile、LoadFromFile和LoadFromStream功能,但它是三层结构的,我用的是C/S结构。
clientdataset能不能LoadFromStream数据后,写回数据库我试过也没有成功!不知道哪位高手能帮忙解决以上问题,或提出其他可以实现以上功能的方法!!!另外,如能完美解决此问题,可以再加分! ^_^ ( 我第一次肯为一个问题加这么多分!)
begin
adodataset1.Close;
adodataset1.CommandText := 'select * from tm';
adodataset1.Open; adodataset1.SaveToFile('c:\temp.log');
ShowMessage('Saved');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
adodataset2.LoadFromFile('c:\temp.log');
ShowMessage('Loaded'); while not adodataset2.Eof do
begin
adodataset1.Append;
adodataset1.FieldByName('id').AsInteger := adodataset2.fieldbyname('id').AsInteger;
adodataset1.FieldByName('col').AsString := adodataset2.fieldbyname('col').AsString;
adodataset1.Post;
adodataset2.Next;
end;
ShowMessage('Inserted');
end;My Email:[email protected]