2013-06-21 5 views
0

У меня проблемы с получением поля blob, содержащего изображения, а затем сохранения его в файл.
Загруженный файл, похоже, не в правильном формате; если я открою с шестнадцатеричным редактором, он содержит слово @ R_BLOB @Сохранение поля blob из базы данных Advantage в файл

Что может быть неправильным?

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; 

Благодаря

+0

Попробуйте 'f: = TFileStream.Create ('c: \ tmp \ db \ img \ 000.jpg', fmOpenWrite); попробуйте f.Seek (0, soFromBeginning); f.CopyFrom (bg, 0); наконец, f.free; end; 'http://www.freepascal.org/docs-html/rtl/classes/tfilestream.create.html Существует мало резона, чтобы сделать промежуточный буфер RAM для этого. –

+1

Ну, на самом деле это все еще избыточно. Почему бы не сделать прямой 'bg.SavetoFile ('c: \ tmp \ db \ img \ 000.jpg');'? –

+2

, если вы читаете http://www.sybase.com/files/White_Papers/SY-Advantage-Delphi-Getting-Started-Guide-080409-WP.pdf, вы также найдете '(adsQuery1.FieldByName ('PAGE') как TBlobField) .SavetoFile ('c: \ tmp \ db \ img \ 000.jpg'); ' –

ответ

0

Исходный текст @ R_BLOB @ зависит от типа таблицы, заданной в свойствах TableType компонента TadsQuery, устанавливая его в ttAdsCDX, экспортируя работу.

Спасибо всем.

2

я использовал следующий код, чтобы написать небольшой (9K) JPEG в качестве ADS BLOB поля через ADSTable, читать его обратно в ADSBlobStream и записать его на диск в отдельном месте , и все работало нормально. Новая копия изображения отлично открывается в Windows Picture Viewer, и я не вижу в ней никаких посторонних символов с шестнадцатеричным просмотром.

// Code to create the test table, done in ARC32 
CREATE TABLE Test (ID Integer, Pic BLOB); 

уронил TADSSettings, TADSQuery, и две простые TButton компоненты на новом бланке VCL. Вот кнопка 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, чтобы прочитать его и записать в новый файл на диске.