PDA

Показать полную графическую версию : [решено] Можно ли из строки шестнадцатиричного формата получить эксель файл ?


Burning Hell
25-11-2017, 19:47
Всем доброго времени суток.

У меня есть большая строка (8000 символов; это поле BLOB в БД Оракл) в шестнадцатеричном формате, которая в действительности является файлом формата .xlsx. Мне нужно эту строку "превратить" в физический файл экселя на диске. Т.е., этот файл "упакован" в BLOB в Оракле. Мне нужно его "распаковать".

Подскажите, пожалуйста, можно ли это сделать средствами vbscript? Нашел, что на vbs есть возможности для взаимодействия с шестнадцатеричными значениями, но не уверен, что это то, что мне нужно. Заранее благодарен.

Iska
25-11-2017, 20:53
Burning Hell, Вам нужен ADODB. И надо быть уверенным, что содержимое поля типа BLOB представляет собой точную бинарную копию файла .xlsx.

Busla
26-11-2017, 18:02
Подскажите, пожалуйста, можно ли это сделать средствами vbscript? »
нет - vbscript не умеет работать с бинарными файлами

Iska
26-11-2017, 18:14
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 »

Есть ли где-то рабочий пример такой штуки с комментариями как ее юзать?

Iska
26-11-2017, 22:50
так в 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-запрос, выделяя потребную запись, значение потребного поля, если оно не пустое, передаёте функции (которая там тупо используется как процедура) вместе с именем потребного файла, в функции создаётся объект потока, в него пишется байтовый массив, полученный из поля, затем содержимое потока записывается в файл на диске.

Busla
26-11-2017, 23:28
WSH всегда умел работать с бинарниками. »
вас не затруднит привести фрагмент соответствующего кода?

Iska
26-11-2017, 23:43
вас не затруднит привести фрагмент соответствующего кода? »
Такой вариант (http://forum.oszone.net/post-1724940.html#post1724940) Вас устроит? Или там же чуть ниже более расширенный (http://forum.oszone.net/post-1745154.html#post1745154)?

Busla
27-11-2017, 09:57
Iska, конечно, нет - Speach API может не быть в системе (как и CAPICOM, который тоже для этих целей бывает используют)

Iska
27-11-2017, 11:39
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 и провайдера?

Iska
27-11-2017, 14:23
Но это как я понимаю, 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:
Что-то не то с провайдером, пишет, что не может найти его.

Iska
27-11-2017, 15:10
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.


Я так понимаю, что тут надо к оракловым админам обращаться.

Iska
28-11-2017, 05:15
Я не очень понимаю, что там должно быть в итоге: 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.

Iska
28-11-2017, 14:49
Burning Hell, ;).




© OSzone.net 2001-2012