我只是使用以下代码通过 ADSTable 将一个小的 (9K) JPEG 写入 ADS BLOB 字段,将其读回 ADSBlobStream 并将其写入单独位置的磁盘,一切正常。图像的新副本在 Windows 图片查看器中可以正常打开,并且我在使用十六进制查看器时看不到任何无关字符。
// Code to create the test table, done in ARC32
CREATE TABLE Test (ID Integer, Pic BLOB);
在新的空白 VCL 表单上删除了TADSSettings
、TADSQuery
和两个普通组件。TButton
这是按钮 OnClick 处理程序(显然,两个处理程序中的文件名都是硬编码的,应该用您机器上的实际文件名替换):
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;
运行应用程序,然后单击Button1
以将图像插入Test
表中。然后单击Button2
以将其读回并将其写入磁盘上的新文件。