Показать полную графическую версию : [решено] Можно ли из строки шестнадцатиричного формата получить эксель файл ?
Burning Hell
25-11-2017, 19:47
Всем доброго времени суток.
У меня есть большая строка (8000 символов; это поле BLOB в БД Оракл) в шестнадцатеричном формате, которая в действительности является файлом формата .xlsx. Мне нужно эту строку "превратить" в физический файл экселя на диске. Т.е., этот файл "упакован" в BLOB в Оракле. Мне нужно его "распаковать".
Подскажите, пожалуйста, можно ли это сделать средствами vbscript? Нашел, что на vbs есть возможности для взаимодействия с шестнадцатеричными значениями, но не уверен, что это то, что мне нужно. Заранее благодарен.
Burning Hell, Вам нужен ADODB. И надо быть уверенным, что содержимое поля типа BLOB представляет собой точную бинарную копию файла .xlsx.
Подскажите, пожалуйста, можно ли это сделать средствами vbscript? »
нет - vbscript не умеет работать с бинарными файлами
vbscript не умеет работать с бинарными файлами »
Busla, это не совсем так. Частично умеет, хотя и не с такой лёгкостью, что большие ЯВУ, имеющие возможность не только последовательного, но и прямого доступа к содержимому файла.
Burning Hell
26-11-2017, 21:06
Вам нужен ADODB »
так в VBScript эта технология есть, разве нет?
greg zakharov
26-11-2017, 21:16
И надо быть уверенным, что содержимое поля типа BLOB представляет собой точную бинарную копию файла .xlsx..xlsx - это по сути ZIP-архив, содежимым которого являются набор xml файлов, так что теоретически, проверив первые четыре байта (а речь ведь, надо понимать, о hex'е) и сверив их с сигнатурой ZIP, можно понять что в поле БД. НО! ADODB лучше не трогать, ибо эта зараза данные целиком грузит в память, лучше использовать нечто легковесное, что-то вроде SAPI.SpFileStream.
нет - vbscript не умеет работать с бинарными файламиСпасибо, улыбнули. WSH всегда умел работать с бинарниками.
Burning Hell
26-11-2017, 21:32
сверив их с сигнатурой ZIP, можно понять что в поле БД »
У меня есть более простой способ понять, что там - в соседнем поле лежит имя файла с его расширением. Так что это не проблема.
SAPI.SpFileStream »
Есть ли где-то рабочий пример такой штуки с комментариями как ее юзать?
так в VBScript эта технология есть, разве нет? »
Неа, нету :). Эта технология имеет отношение к VBScript только тем, что может использоваться последним посредством Automation. В Вашем случае требуется драйвер для доступа к базам данных Oracle.
ADODB лучше не трогать, ибо эта зараза данные целиком грузит в память, лучше использовать нечто легковесное, что-то вроде SAPI.SpFileStream. »
Если верить автору:
большая строка (8000 символов; это поле BLOB в БД Оракл) в шестнадцатеричном формате »
— то и так сойдёт. Если, конечно, верить. У меня пустой лист .xlsx занимает почти семь килобайт.
У меня есть более простой способ понять, что там - в соседнем поле лежит имя файла с его расширением. Так что это не проблема. »
Окажется проблемой, если там не то, что Вы думаете.
Есть ли где-то рабочий пример такой штуки с комментариями как ее юзать? »
Рабочий пример кода с «ADODB.Stream» («SAPI.SpFileStream» Вам понадобится, когда объём поля будет порядка сотен мегабайт) Вы можете взять здесь: how to store a BLOB data on a windows file using vbscript? (https://www.experts-exchange.com/questions/27831877/how-to-store-a-BLOB-data-on-a-windows-file-using-vbscript.html).
Ах, да, комментарии… Всё достаточно просто: подключаетесь к базе Oracle, выполняете SQL-запрос, выделяя потребную запись, значение потребного поля, если оно не пустое, передаёте функции (которая там тупо используется как процедура) вместе с именем потребного файла, в функции создаётся объект потока, в него пишется байтовый массив, полученный из поля, затем содержимое потока записывается в файл на диске.
WSH всегда умел работать с бинарниками. »
вас не затруднит привести фрагмент соответствующего кода?
вас не затруднит привести фрагмент соответствующего кода? »
Такой вариант (http://forum.oszone.net/post-1724940.html#post1724940) Вас устроит? Или там же чуть ниже более расширенный (http://forum.oszone.net/post-1745154.html#post1745154)?
Iska, конечно, нет - Speach API может не быть в системе (как и CAPICOM, который тоже для этих целей бывает используют)
Busla, в системе много чего «может не быть». В том числе может как «ещё не быть» или «уже не быть» — в зависимости от используемой ОС. Но причём тут это?
Burning Hell
27-11-2017, 13:30
Неа, нету »
Мне указали на форум, где было сообщение с вот таким кодом:
Sub test()
Dim conn, rs
Dim strSQL As String
Set conn = CreateObject("ADODB.Connection")
With conn
.ConnectionString = "Provider=MSDAORA;" & _
"Data Source=ORCL10G;" & _
"User ID=System;Password=oracle;"
.Open
End With
Set rs = CreateObject("ADODB.Recordset")
strSQL = "select * from scott.emp"
rs.Open strSQL, conn, 3, 3
Range("A1") = rs("ENAME")
Range("B1") = rs("JOB")
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
End Sub
Но это как я понимаю, VBA?
Вы можете взять здесь: »
Спасибо, попробую запустить.
Iska,
код по ссылке - это VBScript? Т.е. можно ли его двойным щелчком мыши запустить? Можно ли как-то проверить, что к БД проходит коннект?
***
Сейчас пробую подконнектиться к ораклу.
Подскажите, пожалуйста, как посмотреть sid и провайдера?
Но это как я понимаю, VBA? »
Да. Но этот код Вам не нужен. Я давал выше ссылку на тему с потребным кодом.
код по ссылке - это VBScript? »
Да.
Т.е. можно ли его двойным щелчком мыши запустить? »
Можно. Но лучше в командной строке (а ещё лучше — из-под Far Manager'а :)) посредством «cscript.exe» — так проще его отлаживать.
Можно ли как-то проверить, что к БД проходит коннект? »
Если коннект не пройдёт — сразу увидите. Естественно, строка подключения (connection string) должна соответствовать Вашему драйверу и базе данных, запрос должен соответствовать таблице и полям Вашей базы данных.
Подскажите, пожалуйста, как посмотреть sid и провайдера? »
SID? Зачем Вам SID? Разве там, в коде, есть где-то SID?! Есть «User ID». Провайдер, повторю, должен соответствовать Вашей базе данных. Если не знаете (я-то точно не знаю) — можете поэкспериментировать с этими данными: Oracle Provider for OLE DB connection strings (https://www.connectionstrings.com/oracle-provider-for-ole-db-oraoledb/).
Burning Hell
27-11-2017, 14:28
Разве там, в коде, есть где-то SID?! »
Ну да, судя по именам переменных тут нужен и sid, и провайдер.
с этими данными »
спасибо, буду пробовать...
UPD:
sid нашел в файле tnsnames.ora. Осталось найти провайдера.
UPD:
Что-то не то с провайдером, пишет, что не может найти его.
Burning Hell, да нет там SID'а. Это:
Const C_ORA_SID = "XE"
имя соединения.
Burning Hell
27-11-2017, 16:15
имя соединения. »
Я не очень понимаю, что там должно быть в итоге: Data Source или SID? В коде в ConnectionString присутствует наименование Data Source и среди источников данных у меня нет XE. Когда я подставил свой источник данных и провайдер (я нашел его), при проверке тестового соединения система выдала мне сообщение (см. скрин tns_error). Когда запускаю скрипт в командной строке, получаю следующее сообщение:
another_var.vbs(17, 1) ADODB.Connection: Provider cannot be found. It may not be properly installed.
Я так понимаю, что тут надо к оракловым админам обращаться.
Я не очень понимаю, что там должно быть в итоге: Data Source или SID? »
Источник данных.
и среди источников данных у меня нет XE. »
http://www.oracle.com/technetwork/developer-tools/sql-developer/howto-connect-xe-095131.html
Я так понимаю, что тут надо к оракловым админам обращаться. »
Это будет самым правильным выбором.
Burning Hell
28-11-2017, 14:41
Вообщем, проблему удалось-таки решить средствами самого оракла) Оказывается, там есть такой пакет UTL_FILE, который умеет проворачивать такие штуки как распаковка блоба в файл, причем в принципе в любой, какой укажешь. Пришлось, правда, шаманить прикинувшись dba в SQL*Plus.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.