Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись графических файлов в базу MS SQL
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
andrew76
Доброе всем утро !

Возникла необходимость записи графических файлов (тип jpg) в базу SQL.
Файлы jpg хранятся на диске в определенном каталоге.Как записывать строковые значения из 1с в базу sql понятно,
а вот как с графикой команду писать ?
logist
Вероятно как двоичные данные.
andrew76
А по-подробнее (если можно с примером) можно ? в базе tbFoto есть поле Foto.
andrew76
вот,кое-что нашёл :


Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1;
Поток.Open();
Поток.LoadFromFile(ПолноеИмяФайла);
...НужноеПоле.SQL= Поток.Read();



andrew76
При импорте данных всё ок.Но при открытии проги,в базу sql которой пишем фотки-вываливается ошибка "Error stream".
В путаной документации на БД есть указание ,что фото (содержимое поля Foto) должно быть преобразовано к типу Base64.Кто-нибудь
с таким сталкивался ?
Vofka
Есть функция Base64Строка
andrew76
Так тоже не работает :

Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1;
Поток.Open();
Поток.LoadFromFile(ПолноеИмяФайла);
Строка64=Base64Строка(Поток.Read());
Vofka
Потому что надо не поток кодировать, а двоичные данные.
andrew76
Подскажите ,пожалуйста,как это реализовать ?
Vofka
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
СтрокаБэйс64 = Base64Строка(ДвоичныеДанные);
andrew76
не работает : (ошибка не вылеьает,но и в базе нет ничего)

ДвоичныеДанные = Новый ДвоичныеДанные("c:\san\s.jpg");
СтрокаБэйс64 = Base64Строка(ДвоичныеДанные);
Значение=Base64Значение(СтрокаБэйс64);
..НужноеПоле.SQL= Значение;
logist
Цитата(andrew76 @ 08.07.16, 10:52) необходимо зарегистрироваться для просмотра ссылки
Значение=Base64Значение(СтрокаБэйс64);

Это зачем? Вы же этим обратно вернули в двоичные данные.
andrew76
Так что-ли :

ДвоичныеДанные = Новый ДвоичныеДанные("c:\san\s.jpg");
СтрокаБэйс64 = Base64Строка(ДвоичныеДанные);
..НужноеПоле.SQL= СтрокаБэйс64;
logist
ДвоичныеДанные = Новый ДвоичныеДанные("c:\san\s.jpg");
..НужноеПоле.SQL= Base64Строка(ДвоичныеДанные);
andrew76
Не получается.При открытии проги сразу прёт ошибка -"Bitmap Image is Not Valid"
logist
Цитата(andrew76 @ 08.07.16, 12:10) необходимо зарегистрироваться для просмотра ссылки
-"Bitmap Image is Not Valid"

Это скорее всего значит, что изображение не соответствует формату JPG, т.е. по факту в файле JPEG например, или битый файл.

У меня подобная штука работает, таким кодом
СодержимоеФайла = Base64Строка(Новый ДвоичныеДанные(ПутьФайла));


Попробуйте так:
    Картинка = Новый Картинка(ПутьФайла);
    ИмяВрФайла = ПолучитьИмяВременногоФайла();
    Картинка.Записать(ИмяВрФайла);
    СодержимоеФайла = Base64Строка(Новый ДвоичныеДанные(ИмяВрФайла));
andrew76
та же история : При открытии проги сразу прёт ошибка -"Bitmap Image is Not Valid"

может в коде что :

    Картинка = Новый Картинка("c:\san\s.jpg");
    ИмяВрФайла = ПолучитьИмяВременногоФайла();
    Картинка.Записать(ИмяВрФайла);
    СодержимоеФайла = Base64Строка(Новый ДвоичныеДанные(ИмяВрФайла));
    
    ТекстЗапросаADO ="Insert into tbFoto (Active,MainID,Foto) Values (1,'" + un + "','"+СодержимоеФайла+"')";
    Connection.Execute(ТекстЗапросаADO,,128);
Petre
andrew76 @ Сегодня, 13:44 необходимо зарегистрироваться для просмотра ссылки,
Какой тип поля?
andrew76
тип image
andrew76
Попробовал переписать код :

Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1;
Поток.Open();
Поток.LoadFromFile("c:\san\s.jpg");
RecordSet = Новый COMОбъект("ADODB.RecordSet");
RecordSet.CursorLocation = 3;
RecordSet.LockType = 4;
Запрос = "";

RecordSet.Open("Select * from tbFoto", Connection);

RecordSet.AddNew();
ТекстЗапросаADO ="SET IDENTITY_INSERT tbFoto OFF";
Connection.Execute(ТекстЗапросаADO,,128);
RecordSet.Fields("MainID").Value = un;  
RecordSet.Fields("Foto").Value = Поток.Read(-1);
RecordSet.Fields("Active").Value = 1;  
RecordSet.Update();
Поток.Close();
RecordSet.Close();


в строке присваивания полю MainID значения идентификатора -RecordSet.Fields("MainID").Value = un; вываливается ошибка следующего содержания :{Форма.ФормаОтчета.Форма(606)}: Ошибка при установке значения атрибута контекста (Value): Произошла исключительная ситуация (Provider): Член группы не найден.

Что это ?
logist
А что такое "un" ? Предварительно - несоответствие типов.
andrew76
Цитата(logist @ 14.07.16, 20:35) необходимо зарегистрироваться для просмотра ссылки
А что такое "un" ? Предварительно - несоответствие типов.



un- это уникальный идентификатор(GUID),определенный выше по тексту проги.
andrew76
Может попробовать залить фотки вот как-то так :

(но мне еще нужно заполнить 2 поля :MainID=GUID,и Active=1
как эти 2 поля добавить в нижеприведенный запрос затрудняюсь smile.gif

ТекстЗапросаADO ="INSERT INTO tbFoto (Foto) SELECT * FROM OPENROWSET(BULK N'C:\san\s.jpg', SINGLE_BLOB)";
logist
Цитата(andrew76 @ 14.07.16, 19:05) необходимо зарегистрироваться для просмотра ссылки
un- это уникальный идентификатор(GUID),определенный выше по тексту проги.

Проверьте что он совпадает по типу с базой. Например у вас это тип УникальныйИдентификатор а в sql это строка.

Еще попробуйте поле с данными изображения сделать последним.
andrew76
Сделал как Вы советовали :

Ошибка следующего содержания :

Ошибка при установке значения атрибута контекста (Value):
Произошла исключительная ситуация (Microsoft Cursor Engine):
Произошли ошибки во время выполнения многошаговой операции. Проверьте значения всех состояний
andrew76
Следующий фрагмент кода выполняется -при записи в базу ошибок не дает:
Но при запуске проги появляется сообщение "Invalid image type":

Connection = Новый COMОбъект("ADODB.Connection");
unn=ТекущаяДата();
Картинка = Новый Картинка("c:\san\s.jpg");
ИмяВрФайла = ПолучитьИмяВременногоФайла();
Картинка.Записать(ИмяВрФайла);
СодержимоеФайла = Base64Строка(Новый ДвоичныеДанные(ИмяВрФайла));
un=Новый УникальныйИдентификатор;
ТекстЗапросаADO   ="Insert into tbFoto (MainID,Active,EditDate,Foto) Values ('" + un + "',1,'"+unn+"','"+СодержимоеФайла+"')";
Connection.Execute(ТекстЗапросаADO,,128);



Следующий фрагмент кода не выполняется -при записи в базу -ошибка : не найден член группы
в строке с кодом RecordSet.Fields("MainID").Value = un;

Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1;
Поток.Open();
Поток.LoadFromFile("c:\san\s.jpg");
файл_=Поток.Read();
    
RecordSet = Новый COMОбъект("ADODB.RecordSet");
RecordSet.CursorLocation = 3;
RecordSet.LockType = 4;
RecordSet.Open("Select MainID,Active,EditDate,Foto from tbFoto", Connection);
RecordSet.AddNew();
un=Новый УникальныйИдентификатор;
RecordSet.Fields("MainID").Value = un;
RecordSet.Fields("Foto").Value = Поток.Read(-1);
RecordSet.Fields("Active").Value = 1;
RecordSet.Fields("EditDate").Value =ТекущаяДата();
RecordSet.Fields("Foto").Value = Поток.Read(-1);
RecordSet.Update();
Поток.Close();
RecordSet.Close();


Есть какая-нибудь команда в MS SQL которая может на время отключить связь текущей таблицы (куда идёт запись данных-
в моём случае это таблица TbFoto) с другими таблицами?
Может в этом проблема ?
Petre
andrew76 @ Сегодня, 8:20 необходимо зарегистрироваться для просмотра ссылки,
вот здесь:
un=Новый УникальныйИдентификатор;
RecordSet.Fields("MainID").Value = un;

вы пытаетесь присвоить объект 1с в совершенно другой среде - MS SQL. Так не пройдет. Либо присваивайте примитивные типы, либо объекты, созданные в MS SQL.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.