Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Perl+Access: выгрузка blob данныйх в файл
 
 автор: AlexBat   (21.01.2007 в 04:36)   личное сообщение
 
 

Здравствуйте уважаемы специалисты. Столкнулся со следующей проблеммой. Есть база данных с таблицей, в которой хранятся изображения. Таблица вида ID; imgname; imgdata. Эту базу читаю скриптом написанном на Perl. Задача собственно в том чтобы перенести базу в MySQL а изображения выгрузить в отдельные файлы
И тут оказалось что двоичные данные выводятся с непонятными заголовками и соответственно нечитабельны. Поиск по проблеме привел к тому что в Access двоичные данные записываются "не просто так". Более менее внятный пример выгрузки приведен только для VB, в котором я не разбираюсь абсолютно.
Подскажите - как именно надо обработать данные для получения читабельного файла?
вывод для каждого файла начинается с этого

B7D3B4C2BDCA9991B7D4B4
C3BDC7ACB7AACDB4C1BDC
89991DCF1E7051603F1CBF9
FEA19B11998C87989C9DE41
110F8ECD8FC01F6A3A2DAF6
FC08F5FDBD0BF1FFFEA3DA0
.....
... и т.п.

что не соответствует ни одному граф. формату. Картинки в формате JPG

  Ответить  
 
 автор: Bellerofont   (21.01.2007 в 11:13)   личное сообщение
 
 

Из вашего сообщения неясно, что именно хранится в поле, бинарное содержимое файла или OLE object? Какой тип поля используется для хранения файла?
Думаю, что если бы в поле хранилось бинарное содержимое файла, то никаких заголовков там не было бы.

  Ответить  
 
 автор: AlexBat   (21.01.2007 в 12:59)   личное сообщение
 
 

Прошу прощения.
база Access. Поле объекта OLE. В таблице просто указано "двоичные данные". При попытке просто открыть двойным щелчком пишет об ошибке подключения к OLE серверу.
Вообще данные изначально используются программмой написанной на Дельфи.
Тот же шестнадцатиричный код можно увидить если из таблицы создать "страницу доступа к данным".
Под заголовком я имел ввиду File Header он же "сигнатура файла"

  Ответить  
 
 автор: Bellerofont   (21.01.2007 в 15:55)   личное сообщение
 
 

>Вообще данные изначально используются программмой написанной
>на Дельфи.
Видимо отсюда и надо копать. Каким образом данные были занесены в таблицу?

  Ответить  
 
 автор: AlexBat   (21.01.2007 в 16:02)   личное сообщение
 
 

если бы я знал, или были б исходники - я бы посмотрел алгоритм того как они оттуда выбираются и не беспокоил бы вас :)
очевидно что данные должны соответствовать каким то стандартам раз используется база access.
Насколько я понял из пояснений с сайта microsoft данные пишуться блоками, каждый из которых как то обрабатывается, но вот КАК я не понял

  Ответить  
 
 автор: Bellerofont   (21.01.2007 в 17:11)   личное сообщение
 
 

Если в поле нужно хранить просто двоичные данные, то никаким стандартам эти данные не должны соответствовать и никакого заголовка сам Access к данным не добавляет. В поле хранится та последовательность байт, которые ему переданы. А блоками (SetChunk) писать данные необязательно и делается это лишь для экономии памяти. Не ищите причину в Access, причина в том каким образом эти данные записывались и использовались.

  Ответить  
 
 автор: AlexBat   (21.01.2007 в 17:27)   личное сообщение
 
 

в качестве источника информации я нашел вот эти две статьи:
http://support.microsoft.com/kb/103257
http://www.codenet.ru/progr/vbasic/Database-Images.php

откуда я и сделал вывод о том что данные пишуться именно блоками

  Ответить  
 
 автор: Bellerofont   (21.01.2007 в 17:52)   личное сообщение
 
 

Мне нечего добавить к тому, что я написал, кроме того, что я неправильно обозвал метод (написал SetChunk вместо AppendChunk).
В данном случае способ записи (блоками определенного размера или сразу целиком) никак не скажется на результате - в поле будет одно и то же. Не фиксируйте свое внимание на этом.

  Ответить  
 
 автор: AlexBat   (21.01.2007 в 19:08)   личное сообщение
 
 

К сожалению я не достаточно силен в Access. И, до последнего времени, не было необходимости подробно изучать. Однако как я понял в процессе поиска данная проблема- сохранение и чтение изображений в базе данных в формате BLOB имеет довольно большое распространение. В качестве одного из примеров я скачал демонстрационную базу http://accdevel.tripod.com , где поаказаны разные методы сохранения изображений и как BLOB и как OLE. так вот - ни в том ни в другом случае содержимое файла ( я имею ввиду HEX-представление) не сохраняется в исходном виде, а подвергается предварительной (и пост - при чтении) обработке. Т.е. ПОБАЙТОВО прочитать содержимое поля таблицы и скопировать в файл не получится - то есть как раз та самая ситуация что у меня сейчас. Вот я и пытаюсь выяснить как именно необходимо обрабатывать данные.
p.s.: очевидно существует какая то причина, по которой в прямом виде содержимое не записывают в базу
p.p.s: Собственно, я буду очень благодарен если Вы опишите алгоритм обработки этих самых блоков для возвращения исходного вида двоичным данным файла. Мне необходимо повторить его в другом языке. Т.е. прочитать поле - что то с ним сделать - записать в файл на диск

  Ответить  
 
 автор: Bellerofont   (21.01.2007 в 19:30)   личное сообщение
 
 

>- ни в том ни в другом случае содержимое файла ( я имею ввиду HEX-представление)
>не сохраняется в исходном виде, а подвергается предварительной
>(и пост - при чтении) обработке.
покажите, в чем заключается обработка, изменяющая содержимое, на примере функций ReadBLOB и WriteBLOB.

>Т.е. ПОБАЙТОВО прочитать содержимое поля таблицы
>и скопировать в файл не получится - то есть как раз та самая
>ситуация что у меня сейчас.
Я не знаю почему вы делаете такой вывод

>p.s.: очевидно существует какая то причина, по которой в прямом виде содержимое не >записывают в базу
Мне эта причина неочивидна и неизвестна, я всегда записываю содержимое файла в прямом виде.

  Ответить  
 
 автор: Bellerofont   (21.01.2007 в 20:42)   личное сообщение
12 Кб.
 
 

Прилагаю mdb с табличкой, содержащей поле OLE, и двумя процедурами
ReadFile(ByVal vstrFilename As String) и WriteFile(ByVal vstrFilename As String)
Никакого преобразования данных они не производят.
Выполните из окна отладки (Immediate window)
ReadFile ПутьИИмяВашегоФайла.jpg
а затем
WriteFile ПутьИИмяКопииФайла.jpg
а потом сравните, есть ли отличия в этих файлах.

  Ответить  
 
 автор: AlexBat   (21.01.2007 в 23:11)   личное сообщение
 
 

да, в вашем примере не отличается :(
а теперь попробуйте http://accdevel.tripod.com/Downloads/ImagesA2K.ZIP
там отличается до неузнаваемости. в общем, судя по всему, кто во что горазд и прочитать этот файл без исходников родной программы не удастся :(

  Ответить  
 
 автор: osmor   (22.01.2007 в 08:51)   личное сообщение
 
 


Поле объекта OLE. В таблице просто указано "двоичные данные". 
При попытке просто открыть двойным щелчком пишет об ошибке подключения к OLE серверу. 
Вообще данные изначально используются программмой написанной на Дельфи
.

Смею предположить, что программа на дельфи, сохраняет (извлекает) данные по какому-то своему алгоритму...

  Ответить  
 
 автор: Bellerofont   (22.01.2007 в 10:54)   личное сообщение
 
 

>Смею предположить, что программа на дельфи, сохраняет
>(извлекает) данные по какому-то своему алгоритму...
Я давно об этом говорю, но ...

  Ответить  
 
 автор: AlexBat   (22.01.2007 в 18:22)   личное сообщение
 
 

после более глубокого "вкуривания" проблемы потихоньку прихожу к выводу что это именно ограничение delphi. Спасибо и извините за беспокойство

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList