Страницы: 1
RSS
Сохранить картинки из recordset в файлы
 
Доброе время суток.

Подключением к базе через ADODB.Connection получаю запросом recordset: строковое поле и картинку (jpeg).
Надо выгрузить их по файлам.
Делаю через:
Код
            Open strPath For Output Access Write As #1
            Put #1, 1, ObjRecordset.Fields(2).Value
            Close #1
Выгружаются, но размер у каждой +12 байт.
О причине нагуглил, да.
Не могу найти вариант записать картинки в файл as is.
Подскажете?
 
Доброе время суток
Ну, во первых попробуйте сохранять
Код
            Open strPath For Binary As #1
            Put #1, 1, ObjRecordset.Fields(2).Value

Это же бинарное содержимое
Во вторых вы могли ошибиться с номером поля. Нумерация начинается с 0. Лучше так
Код
ObjRecordset("ImageFieldName").Value

И в третьих - есть маленькая тонкость - как вы сохраняли картинку? Если так же, через байт массив, то всё получиться. Если же вы использовали Access и сохраняли её через вставить объект в поле объекта Ole, то там находится пакет Ole.
Поищите "Как извлечь картинку/растр из поля Ole Access". Много интересного узнаете;) Не то чтобы ёрничал, но то ещё удовольствие.

Успехов.
 
Спасибо за ответ.

Поменял на Binary (у меня уже был такой закомментированный вариант, оказывается) - результат тот же: проводник не показывает превьюшки, в содержимом сначала идут лишние символы. FastStone просматривает, но это он такой молодец.
С номерами полей не ошибся - сначала из запроса возвращаются два строковых значения, картинка третьей.
Картинки в базе хранятся именно jpeg'ами, из интерактива выгружаются (call xp_write_file('c:\путь\' || id_cert || '.jpg', doc_image);) нормально и без бубнов.

Какие еще могут быть варианты? Переводить в массив байт? Искать какую-то альтернативу put? ADODB.Stream  не сработает?
 
Доброе время суток
У меня через байт массив загрузил в поле таблицы и выгрузил из него без проблем. Прямая запись значения поля в бинарый файл привела к ошибке содержимого файла - размер увеличился. Возможно, VBA записал и данные типа Variant, который возвращает Value Recorset'а
Код
Public Sub testExportImg()
    Const sConn = "Provider=Microsoft.ACE.OleDb.12.0;Mode=16;Data Source=$1"
    Dim pConn As New ADODB.Connection, pRSet As New ADODB.Recordset
    Dim fNum As Integer, sName As String, vData() As Byte
    pConn.Open Replace$(sConn, "$1", ThisWorkbook.Path & "\myDb.accdb")
    pRSet.CursorLocation = adUseClient
    pRSet.Open "Select * from myTable", pConn, adOpenStatic, adLockOptimistic
    pRSet.MoveFirst
    
    fNum = FreeFile
    Open ThisWorkbook.Path & "\123.png" For Binary As #fNum
    vData = pRSet("blob").Value
    Put #fNum, , vData
    Close #fNum
    pRSet.Close: pConn.Close
End Sub

Так что конкретно нужно смотреть, что там у вас в таблице.
Изменено: Андрей VG - 20.04.2015 09:03:18
 
Цитата
Андрей VG написал: Возможно, VBA записал и данные типа Variant
Да, именно так.
Сделал, как у вас - объявил массивом байт, и все получилось!
Спасибо огромное.
Страницы: 1
Наверх