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