Мне нужно выполнить преобразование данных из старой базы данных ms sql 6.5, теперь у меня возникла проблема с хранилищем изображений внутри ms sql 6.5, все эти изображения хранятся в виде ole-данных, что означает, что на самом деле старое приложение, которое взаимодействует с этой таблицей ms sql 6.5, действительно хранитизображение как оле в типе изображения.Когда я выбираю BLOB-объект в BLOB-объекте в Powerbuilder, мне нужно отправить этот BLOB-объект в ole_1.objectdata, а затем преобразовать этот ole_1.objectdata в нужную длину, чтобы вывести его в файл растрового изображения на диске, я извлек этот код перевода из expert-обмен на "Печать BLOB-объектов в bmp / jpg" (опубликовано Buasuwan, однако не может получить DLL, поскольку сообщение является старым сообщением).Он отлично работает для 60% моего блоба, преобразованного в растровое изображение, в то время как остальные выдают пустое представление с соответствующим размером файла, просто не могу его просмотреть. Вот код, я хотел бы, чтобы некоторые гуру помогли мне с переводом ole в растровое изображение
Blob lb_image
SelectBLOB picture_image into :lb_image
from individual
where individual_object_id='200506061121430020'
using SQLCA;
if SQLCA.sqlcode<>0 then
messagebox("cannot connect","cannot connect")
end if
if(len(lb_image)>0) then
ole_1.objectdata=lb_image
gf_convertbmp(ole_1.objectdata,ls_path)
end if
my gf_convertbmp следующим образом
long ll_index, ll_len, ll_length
integer li_FileNum
// Find Keyword 'BM' for starting Bitmap File
ll_len = Len(lb_ole_data)
ll_index = 1
blob lb_bm
lb_bm = blob('BM')
do while ll_index <= ll_len
if BlobMid(lb_ole_data, ll_index, 2) = lb_bm then
exit
end if
ll_index++;
loop
// Find Length of Image
ll_length = long(asc(char(BlobMid(lb_ole_data, ll_index - 4, 1)))) + &
long(asc(char(BlobMid(lb_ole_data, ll_index - 3, 1)))) * 256 + &
long(asc(char(BlobMid(lb_ole_data, ll_index - 2, 1)))) * 65536
// Save Bitmap to File
li_FileNum = FileOpen(filename, StreamMode!, Write!, LockWrite!, Replace!)
// Write Bitmap Data
do while ll_length > 0
if ll_length > 32000 then
FileWrite(li_FileNum, BlobMid(lb_ole_data, ll_index, 32000))
else
FileWrite(li_FileNum, BlobMid(lb_ole_data, ll_index, ll_length))
exit
end if
ll_index += 32000
ll_length -= 32000
loop
FileClose(li_FileNum)