实现功能如下:
从数据库中查询一些数据,如: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数据后,写回数据库我试过也没有成功!不知道哪位高手能帮忙解决以上问题,或提出其他可以实现以上功能的方法!!!另外,如能完美解决此问题,可以再加分! ^_^ ( 我第一次肯为一个问题加这么多分!)

解决方案 »

  1.   

    我这样做可以把数据读到文件再写回去,但我不知你是怎么压缩的。procedure TForm1.Button1Click(Sender: TObject);
    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]