![]() |
![]() |
![]() |
|
Проблема с чтением бинарных данных из sql в 1с | ☑ | ||
---|---|---|---|---|
0
Кукалёв Анатолий
19.01.10
✎
02:38
|
Читаю бинарные данные из полей sql-ной таблицы. Почемуто после чтения поля в переменную попадает строка типа: 0xFFD8FFE000104A46494600010100000100010000FFFE002E496E74656C и т.д.
Скажите что это за строка? И как ее с помощью 1С-ки в картинку конвертнуть ? |
|||
1
Кукалёв Анатолий
19.01.10
✎
02:52
|
В sql тип поля image
|
|||
2
kitt
19.01.10
✎
03:06
|
||||
3
Кукалёв Анатолий
19.01.10
✎
03:25
|
Про двоичные данные прочел, но как преобр. эту строку в файл с помощью 1С-ки ?
|
|||
4
kitt
19.01.10
✎
04:04
|
ну, мне неизвестно каким образом вы получаете данные из SQL в 1С
может существует способ получать данные сразу в нужном виде. Ну а вообще алгоритм примерно такой: допустим есть строка 0xFFD8FFE000104A46494600010100000100010000FFFE002E496E74656C отбрасываем указатель шеснадцетеричности "0x", затем в цикле берем два левых символа, FF = преобразуем из шеснадцетеричной системы в десятичную FF=255, записываем в файл символ с полученным кодом 255, уменьшаем обрабатываемую строку на 2 символа слева D8FFE000104A46494600010100000100010000FFFE002E496E74656C затем снова берем два левых символа D8 преобразуем из шеснадцетеричной системы в десятичную D8=216, дописываем в конец файла символ с кодом 216. И так далее, пока символны не кончаться. Это чисто для теории, наверняка есть какие нибудь более гуманные варианты. Вопрос про получении данных из SQL в 1с остается открытым. |
|||
5
Кукалёв Анатолий
19.01.10
✎
04:16
|
Коннект к sql
Запросом выбираем поля (у меня имя поля = A_IMG) Последовательно прочитываем каждое поле (например в переменную СтрИМГ) и ... ... и дальше нужно сохранить полученную строку в изображение |
|||
6
kitt
19.01.10
✎
04:19
|
Тогда дерзайте, способ я описал
|
|||
7
Кукалёв Анатолий
19.01.10
✎
04:21
|
Да спс Я попробую
|
|||
8
Кукалёв Анатолий
19.01.10
✎
04:23
|
Только вот вопрос: а в файле в итоге получиться строка сост из 10-х значений ?! А смысл перевода ?
|
|||
9
kitt
19.01.10
✎
04:28
|
Нет
СтрокаНач = "FFD8FFE000104A46494600010100000100010000FFFE002E496E74656C"; СтрокаДвоич = ""; Пока СтрДлина(СтрокаНач)>0 Цикл ТекСимволы =Лев(СтрокаНач,2); СтрокаНач = Прав(СтрокаНач,СтрДлина(СтрокаНач)-2); СимволДес = Шеснад2Дес(ТекСимволы); СтрокаДвоич = СтрокаДвоич+Симв(СимволДес); КонецЦикла; Файл = Новый ТекстовыйДокумент; Файл.УстановитьТекст(СтрокаДвоич); Файл.Записать("C:\binary.hex","windows-1251");//Насчет кодировки я фиг знает То есть в файл попадают не десятичные цифры, и символы, коды которых равны тесятичным цифрам. Это разные вещи |
|||
10
Кукалёв Анатолий
19.01.10
✎
04:30
|
Понял. Сейчас опробую
|
|||
11
Кукалёв Анатолий
19.01.10
✎
04:38
|
Шеснад2Дес - ?
|
|||
12
Кукалёв Анатолий
19.01.10
✎
04:41
|
Символ(<Код символа>)
<Код символа> (обязательный) Тип: Число. Код получаемого символа. Код задается в соответствии с кодировкой Unicode. Пример: Буква_Я = Символ(1103); Исходя из этого - точно функция "Символ" ? |
|||
13
Кукалёв Анатолий
19.01.10
✎
04:42
|
Это в 8.1 так
|
|||
14
kitt
19.01.10
✎
04:42
|
Ну я это образно
Функция Из_Любой_В_10(Знач Значение="0",Нотация=36) Экспорт Если Нотация<=0 Тогда Возврат(0) КонецЕсли; Значение=СокрЛП(Значение); Если Значение="0" Тогда Возврат(0) КонецЕсли; Результат=0; Длина=СтрДлина(Значение); Для Х=1 По Длина Цикл М=1; Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла; Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М; КонецЦикла; Возврат Окр(Результат); КонецФункции СимволДес = Из_Любой_В_10(ТекСимволы,16); |
|||
15
kitt
19.01.10
✎
04:42
|
(12,13) Да, я видимо из 7ки написал функцию
|
|||
16
Кукалёв Анатолий
19.01.10
✎
05:08
|
Что то не вышло ))
|
|||
17
kitt
19.01.10
✎
05:11
|
что именно?
|
|||
18
Кукалёв Анатолий
19.01.10
✎
05:14
|
Файл создает, но в jpg переименовываю он не отображает картинку
|
|||
19
Кукалёв Анатолий
19.01.10
✎
05:15
|
По моему проблема в ф-ии "Символ". В 8-ке Код задается в соответствии с кодировкой Unicode
|
|||
20
Кукалёв Анатолий
19.01.10
✎
05:16
|
Там в хелпе пример был: Буква_Я = Символ(1103);
|
|||
21
Кукалёв Анатолий
19.01.10
✎
05:16
|
откуда значение 1103 если мы максимум ff=255 ?
|
|||
22
kitt
19.01.10
✎
05:40
|
Это юникод. Первый 127 значений там такие же как в ASCII. Вообще 0 - 127 управляющие символы, цифры, пунктуация, латинский алфавит. Больше у тебя в двоичных данных ничего не будет
|
|||
23
H A D G E H O G s
19.01.10
✎
09:14
|
Мистец
|
|||
24
asady
19.01.10
✎
09:30
|
(23) :) скажи спасибо что они в БЗню это не рекомендовали
|
|||
25
kitt
19.01.10
✎
09:33
|
в чем проблемы уважаемые?
|
|||
26
H A D G E H O G s
19.01.10
✎
09:39
|
Вот 2 процедуры чтения/записи картинки напрямую в SQL (из 1С)
Процедура КнопкаВыполнитьНажатие(Кнопка) Stream=Новый COMОбъект("ADODB.Stream"); Stream.Type=1; Stream.Open(); Stream.LoadFromFile("C:\БылЗвонок.bmp"); Connection=Новый COMОбъект("ADODB.Connection"); Connection.Open("Provider=SQLOLEDB.1; Data Source=NEXTGEN; Initial Catalog=MyBase; User ID=sa;"); RecordSet=Новый COMОбъект("ADODB.Recordset"); RecordSet.CursorLocation=3; RecordSet.LockType=2; Запрос="Select data from dbo.MyTable"; RecordSet.Open(Запрос, Connection); Если RecordSet.RecordCount=0 Тогда RecordSet.AddNew(); // RecordSet.Fields(0).Value=1; Иначе RecordSet.MoveFirst(); КонецЕсли; RecordSet.Fields("Data").Value=Stream.Read(-1); RecordSet.Update(); Stream.Close(); КонецПроцедуры Процедура ОсновныеДействияФормыd(Кнопка) Stream=Новый COMОбъект("ADODB.Stream"); Stream.Type=1; Stream.Open(); Connection=Новый COMОбъект("ADODB.Connection"); Connection.Open("Provider=SQLOLEDB.1; Data Source=NEXTGEN; Initial Catalog=MyBase; User ID=sa;"); RecordSet=Новый COMОбъект("ADODB.Recordset"); RecordSet.CursorLocation=3; RecordSet.LockType=2; Запрос="Select data from dbo.MyTable"; RecordSet.Open(Запрос, Connection); RecordSet.MoveFirst(); Stream.Write(RecordSet.Fields("Data").Value); Stream.SaveToFile("c:\БылЗвонокВост.bmp"); Stream.Close(); КонецПроцедуры |
|||
27
H A D G E H O G s
19.01.10
✎
09:40
|
НО.
Мне интересно, что за значения в (0) и как они получены? |
|||
28
mooo
19.01.10
✎
09:46
|
|
|||
29
H A D G E H O G s
19.01.10
✎
09:54
|
(28) Нет. Нет в (0) символа старше F
|
|||
30
kitt
19.01.10
✎
09:57
|
я говорил в (4) что есть более оптимальные способы. Но если в лоб, можно и как в (9), должно работать
|
|||
31
kitt
19.01.10
✎
09:59
|
(28) вообще то "0x" в (0) нам как бы намекает
|
|||
32
Кукалёв Анатолий
19.01.10
✎
13:46
|
Я коннектюсь так :
SQLServer = Новый COMОбъект("SQLDMO.SQLServer"); SQLServer.LoginSecure = 1; SQLServer.Connect("(local)"); ЗапросСтруктура = "SELECT A_IMAGE |FROM E_002"; РезультатСтруктура = SQLServer.Databases("tel").ExecuteWithResults(ЗапросСтруктура); Для НомерЗаписи = 1 По РезультатСтруктура.Rows Цикл A_IMAGE = РезультатСтруктура.GetColumnString(НомерЗаписи,1); Сообщить(A_IMAGE); Прервать; КонецЦикла; |
|||
33
shuhard
19.01.10
✎
13:50
|
(32)[SQLDMO]
перейди на ADODB см.(26) |
|||
34
Кукалёв Анатолий
19.01.10
✎
13:54
|
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=(local);Initial Catalog=tel;"); RecordSet = Новый COMОбъект("ADODB.Recordset"); RecordSet.CursorLocation = 3; RecordSet.LockType = 2; Запрос = "SELECT A_IMAGE FROM dbo.tel"; RecordSet.Open(Запрос, Connection); RecordSet.MoveFirst(); Stream = Новый COMОбъект("ADODB.Stream"); Stream.Type=1; Stream.Open(); Stream.Write(RecordSet.Fields("Data").Value); Stream.SaveToFile("c:\123.jpg"); Stream.Close(); на RecordSet.Open(Запрос, Connection); выдает ошибку. |
|||
35
shuhard
19.01.10
✎
14:00
|
(34) udl файлик и вперёд
|
|||
36
Кукалёв Анатолий
19.01.10
✎
14:02
|
а это как? в смысле как его к 1с-ке прикрутить ?
|
|||
37
shuhard
19.01.10
✎
14:04
|
(38) не прикрутить, отладить строку конекта
ксати было FROM E_002 стало FROM dbo.tel |
|||
38
H A D G E H O G s
19.01.10
✎
14:07
|
Как минимум:
1) Не указан пользователь 2) Имя сервера не может быть (local) |
|||
39
Кукалёв Анатолий
19.01.10
✎
14:07
|
Вот Я затупан ... (37) - все поправил, все работает! Огромное спс
|
|||
40
Кукалёв Анатолий
19.01.10
✎
14:09
|
Сори ... всю ночь не спал практически ...
1) Пользователь - там идет аут винды 2) имя сервера как раз (local) , т.к. локально на моем буке Ошибся в запросе вместо таблицы указал БД Еще раз всем спавибо ... вопрос решен! |
|||
41
H A D G E H O G s
19.01.10
✎
14:12
|
(40) У меня под 'local' ADO отвергло мои домагательства.
|
|||
42
Кукалёв Анатолий
19.01.10
✎
14:13
|
local - выдает ош, а (local) - должен работать
|
|||
43
shuhard
19.01.10
✎
14:13
|
(39) порнуху то с сиквела дашь посмотреть
(41) [У меня под 'local' ADO отвергло мои домагательства] могли алиасы у сиквела побиться |
|||
44
Кукалёв Анатолий
19.01.10
✎
14:14
|
(43) на счет порнухи не понял ? ))
|
|||
45
H A D G E H O G s
19.01.10
✎
14:15
|
(44) Ну если ты всю ночь ковырял - значит в базе - эксклюзив.
|
|||
46
shuhard
19.01.10
✎
14:15
|
(44) что,кроме порнухи можно всю ночь с сервера пытаться вытащить ?
|
|||
47
Кукалёв Анатолий
19.01.10
✎
14:16
|
Хаа ...
Да нее ... Есть у орг. прога на делфях по сотовым ... а ее надо в 1с-ку заточить вот и разбирался. |
|||
48
shuhard
19.01.10
✎
14:39
|
(47)[Да нее ]
зажал учтём |
|||
49
H A D G E H O G s
модератор
19.01.10
✎
14:59
|
(47) Значит делится не будем. Ну-ну :-)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |