|
Varbinary. Массив байт. Двоичные данные. ПолучитьСтрокуИзДвоичныхДанных | ☑ | ||
---|---|---|---|---|
0
Geroy
10.04.23
✎
11:44
|
Необходимо из колонки _Content в таблице MSSQL получить содержимое
Колонка в MSSQL _Content (varbinary(max), not null) 1. Через ADODB.Connection и ADODB.RecordSet выполняется запрос к СУБД 2. Получаю массив байт RecordSet.Fields("_Content").Value.Выгрузить() 3. Получаю двоичные данные Длинна = Массив.Количество(); Буфер = новый БуферДвоичныхДанных(Длинна); Для индекс = 0 по Длинна - 1 Цикл Буфер.Установить(индекс,Массив[индекс]); КонецЦикла; Поток = новый ПотокВПамяти(Буфер); Поток.ЗакрытьИПолучитьДвоичныеДанные() ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные(); 4. Из двоичных данных получаю строку ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные ,КодировкаТекста.UTF8) Но не все строка читабельного вида ( v �f�c�¢ED?�'�(8 ���n���DSU�m� �=>o&L�[{) ��o0 �[G�S���K ����uCO�Lcy}Wt� ��bʚ�oH@�,��� *h *� �8h�&D[��<�I1��*� ���P�����I���k* x��̹��*@r>Выполняется передача статуса Какие еще есть варианты получить содержимое ? |
|||
1
arsik
гуру
10.04.23
✎
11:49
|
Ну "Буфер = новый БуферДвоичныхДанных(Длинна);" - это ты как длину то посчитал?
|
|||
2
Geroy
10.04.23
✎
11:51
|
(1) Длина = RecordSet.Fields("_Content").Value.Выгрузить().Количество()
|
|||
3
arsik
гуру
10.04.23
✎
11:56
|
(2) Мне непонятно.
>Получаю массив байт RecordSet.Fields("_Content").Value.Выгрузить() А ты уверен, что в массиве все элементы по 1 байту? |
|||
4
H A D G E H O G s
10.04.23
✎
12:01
|
(0) Сохрани двоичные данные в файлец, файлец winhex-ом глянь, че там у тебя в байтах и как они совпадают с MS SQL в Enterprise manager
|
|||
5
H A D G E H O G s
10.04.23
✎
12:02
|
(0) Есть уверенность, что в _Content - UFT8 ?
|
|||
6
Geroy
10.04.23
✎
13:23
|
(5) 100% нет уверенности, но там структура должна быть
(3) как проверить? я вижу что запросом к sql получаю их |
|||
7
H A D G E H O G s
10.04.23
✎
13:52
|
(6) Почему вы думаете, что структуру можно преобразовать к строке?
|
|||
8
Geroy
10.04.23
✎
14:20
|
(7) вообщем задача, получить содержимое колонки "_Content" (varbinary(max), not null)
|
|||
9
lodger
10.04.23
✎
14:25
|
там, небось, ХраналищеЗначения?
у него сжатие бывает. попробуй разжать. |
|||
10
Geroy
10.04.23
✎
14:33
|
(9) это таблицы платформенной "Истории данных"
Таблица версий данных истории данных _DataHistoryVersions _Content — Данные версии |
|||
11
lodger
10.04.23
✎
14:38
|
(10) это почти наверняка ХранилищеЗначений, с непубличным доступом, но с логикой, которая не противоречит существующим ранее компонентам системы.
|
|||
12
lodger
10.04.23
✎
14:41
|
почитай грязные трюки из https://infostart.ru/public/1050764/
по смыслу очень рядом |
|||
13
Geroy
10.04.23
✎
14:45
|
(12) тут только вопрос как получить "ХранилищеЗначения" из запроса к скулю
|
|||
14
lodger
10.04.23
✎
14:48
|
(13) представь себе, что
ДанныеВBase64 = XMLСтрока(ХранилищеЗначения); // Получим Base64 хранилища значения ДвоичныеДанные = Base64Значение(ДанныеВBase64); // Получаем двоичные данные хранилища значения ты уже сделал? и ДвоичныеДанные у тебя = RecordSet.Fields("_Content").Value.Выгрузить(). |
|||
15
Geroy
10.04.23
✎
14:52
|
(14) так выше (3) было замечание что там может не корректный массив байтов
|
|||
16
Geroy
10.04.23
✎
16:34
|
(14) попробовал результат пустой файл
|
|||
17
lodger
10.04.23
✎
16:47
|
(16) подождём ещё, когда ты в отладчике заглянешь что тут, что там, как это переложить.
|
|||
18
Geroy
10.04.23
✎
16:58
|
(17) да смотрю, кручу-верчу)
Пока идей нет |
|||
19
ДедМорроз
10.04.23
✎
19:05
|
Только,кодировка utf-16,а не utf-8 должна быть
|
|||
20
Geroy
11.04.23
✎
08:27
|
(19) почему 16 ?
Выше пример разбора именно в utf-8 получаю последнюю строку "адекватную" v �f�c�¢ED?�'�(8 ���n���DSU�m� �=>o&L�[{) ��o0 �[G�S���K ����uCO�Lcy}Wt� ��bʚ�oH@�,��� *h *� �8h�&D[��<�I1��*� ���P�����I���k* x��̹��*@r>Выполняется передача статуса |
|||
21
Geroy
11.04.23
✎
11:05
|
(11) провел тест, для вручную созданного хранилища значений нет проблем с получением его данных через запрос к mssql
Скорее всего в колонке RecordSet.Fields("_Content") не хранилище значений Детали теста: создал регистр и выполнил запись Данные = Новый Структура; Данные.Вставить("Б", Ложь); Данные.Вставить("Ч", 15.5); Данные.Вставить("С", "проверка"); Данные.Вставить("Д", ТекущаяДата()); ЗР = РегистрыСведений.ТестХЗ.СоздатьМенеджерЗаписи(); ЗР.УИД = Новый УникальныйИдентификатор; ЗР.ХЗ = Новый ХранилищеЗначения(Данные); ЗР.Записать(); Далее запросом к MSSQL получил МассивБайт = RecordSet.Fields("_Fld4273").Value.Выгрузить(); Длинна = МассивБайт.Количество(); Буфер = новый БуферДвоичныхДанных(Длинна); Для индекс = 0 по Длинна - 1 Цикл Буфер.Установить(индекс,МассивБайт[индекс]); КонецЦикла; Поток = новый ПотокВПамяти(Буфер); ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные(); //первые способ НашеЗначениеПервое = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные,КодировкаТекста.UTF8); // Второй способ СтрокаBase64 = Base64Строка(ДвоичныеДанные); ХЗ = СериализаторXDTO.XMLЗначение(Тип("ХранилищеЗначения"), СтрокаBase64); НашеЗначениеВторое = ХЗ.Получить(); Результат: Способ №1 НашеЗначениеПервое � {"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e, {4, { {"S","Б"}, {"B",0} }, { {"S","Ч"}, {"N",15.5} }, { {"S","С"}, {"S","проверка"} }, { {"S","Д"}, {"D",20230411085522} } } } Способ №2 НашеЗначениеВторое Свойство Значение Тип НашеЗначениеВторое Структура Структура Б Ложь Булево Д 11.04.2023 8:55:22 Дата С "проверка" Строка Ч 15,5 Число |
|||
22
lodger
11.04.23
✎
12:17
|
(21) а теперь повтори опыт с применением
ЗР.ХЗ = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9)); |
|||
23
Geroy
11.04.23
✎
13:36
|
(22)
НашеЗначениеПервое SKo��N��붽�� ;� �w�VRV�112�00�L�5O5��5IK�Ե4LI�M2K�45L1MN�H���6@����ta�R-��䤤cP��U�"�*駤ch�g�!�*���pa߅M��]6(a��U�cd`dl`bhhhllbjR A НашеЗначениеВторое Все ок, так же структура |
|||
24
Волшебник
модератор
11.04.23
✎
14:00
|
(23) Просьба не засорять форум спецсимволами. Выкладывайте на https://pastebin.com/
|
|||
25
lodger
11.04.23
✎
15:08
|
(24) спецсимволы дороже хранить на жестком диске?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |