Delphi 将blob字段从Advantage DB保存到文件

Delphi 将blob字段从Advantage DB保存到文件,delphi,blob,advantage-database-server,Delphi,Blob,Advantage Database Server,检索包含图像的blob字段,然后将其保存到文件时遇到问题。 下载的文件似乎格式不正确;如果我打开 它带有一个十六进制编辑器,其中包含单词@R_BLOB@ 有什么不对劲吗 bg: = TAdsBlobStream.Create (adsQuery1.FieldByName ('PAGE') as TBlobField, bmReadWrite); f: = TMemoryStream.create; bg.Position: = 0; f.CopyFrom (bg, bg.size); f.Sav

检索包含图像的blob字段,然后将其保存到文件时遇到问题。
下载的文件似乎格式不正确;如果我打开 它带有一个十六进制编辑器,其中包含单词@R_BLOB@

有什么不对劲吗

bg: = TAdsBlobStream.Create (adsQuery1.FieldByName ('PAGE') as TBlobField, bmReadWrite);
f: = TMemoryStream.create;
bg.Position: = 0;
f.CopyFrom (bg, bg.size);
f.SaveToFile ('c: \ tmp \ db \ img \' + IntToStr (n) + '. jpg');
f.free;

谢谢

我刚刚使用以下代码通过ADSTable将一个小的(9K)JPEG写入ADSBLOB字段,将其读回ADSBlobStream并将其写入单独位置的磁盘,所有操作都很正常。图像的新副本在Windows图片查看器中可以很好地打开,并且我在十六进制查看器中没有看到任何无关字符

// Code to create the test table, done in ARC32
CREATE TABLE Test (ID Integer, Pic BLOB);
在新的空白VCL表单上删除了一个
t设置
t设置
,和两个普通的
t按钮
组件。下面是按钮OnClick处理程序(显然,两个处理程序中的文件名都是硬编码的,应该用计算机上的实际文件名替换):


运行应用程序,然后单击
按钮1
将图像插入
测试
表。然后单击
按钮2
将其读回并写入磁盘上的新文件。

初始文本@R\u BLOB@取决于组件TadsQuery的properties TableType中设置的表格类型,将其设置为ttAdsCDX,导出工作


谢谢大家。

试试
f:=TFileStream.Create('c:\tmp\db\img\000.jpg',fmOpenWrite);尝试f.Seek(0,从开始);f、 copyrom(bg,0);最后f.free;结束几乎没有理由为此制作中间RAM缓冲区。实际上,这仍然是多余的。为什么不直接
bg.SavetoFile('c:\tmp\db\img\000.jpg')?如果您阅读,您还会发现
(adsQuery1.FieldByName('PAGE')作为TBlobField.SavetoFile('c:\tmp\db\img\000.jpg')您是否排除了blob数据确实包含该标记,以及它是如何写入数据库的?运行一些本机到Advantage db编辑器并尝试从中导出blob,可能它最初是以这种方式加载到db中的?
procedure TForm1.Button1Click(Sender: TObject);
var
  Blob: TAdsBlobStream;
  Strm: TFileStream;
  Tbl: TAdsTable;
begin
  Tbl := TAdsTable .Create(nil);
  try
    Tbl.DatabaseName := AdsQuery1.DatabaseName;
    Tbl.TableType := ttAdsCDX;
    Tbl.TableName := 'Test.dbf';
    Tbl.Open;
    Tbl.Edit;
    Blob := Tbl.CreateBlobStream(AdsQuery1.Fields[1], bmWrite) as TAdsBlobStream;
    try
      Strm := TFileStream.Create('E:\Test\Images\Big folder.jpg', fmOpenRead);
      try
        Blob.CopyFrom(Strm, Strm.Size);
      finally
        Strm.Free;
      end;
    finally
      Blob.Free;
    end;
  finally
    Tbl.Post;
    Tbl.Close;
    Tbl.Free;
    AdsQuery1.Open;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Blob: TAdsBlobStream;
  Strm: TFileStream;
begin
  AdsQuery1.SQL.Text := 'SELECT ID, pic FROM test';
  AdsQuery1.Open;
  Blob := AdsQuery1.CreateBlobStream(AdsQuery1.Fields[1], bmRead) as TAdsBlobStream;
  try
    Strm := TFileStream.Create('E:\TempFiles\BigFolder.jpg', fmCreate);
    try
      Strm.CopyFrom(Blob, Blob.Size);
    finally
      Strm.Free;
    end;
  finally
    Blob.Free;
  end;
end;