Выгрузка картинки из ХранилищеЗначения 1С в blob поле в Oracle

1. oveksKnaaz 06.08.15 04:15 Сейчас в теме
Стоит задача передавать фотографии физ. лиц хранящиеся в реквизите с типом ХранилищеЗначения из 1С во внешную БД под управлением Oracle. Пробую выгрузить через ADO. В БД создана таблица "people" с полями GD тип varchar2 для хранения идентификатора физ. лица и foto тип blob для фотографии. Код выгрузки примерно такой:
...
	// Сознание команды для запроса на вставку строки
        Кмд = Новый COMОбъект("ADODB.Command");
	Кмд.ActiveConnection	= СоединениеADO;
	Кмд.Prepared		= Истина;
	
        // Определение типа и длинны для создания параметра
	Каталог = Новый COMОбъект("ADOX.Catalog");
	Каталог.ActiveConnection = мСоединениеADO;
	Колонки = Каталог.Tables.Item("PEOPLE").Columns;
	
        // Создание параметра 
	Параметр = Кмд.CreateParameter(Колонки.Item(1).Name, Колонки.Item(1).Type, 1, Колонки.Item(1).DefinedSize );
	Параметр.Value = foto.Получить().ПолучитьДвоичныеДанные();
	Кмд.Parameters.Append(Параметр);
	
        // Определение текста запроса 
        Кмд.CommandText			= "ins ert into people " +
					  "values('" + ТекущаяСтрока.Ссылка.УникальныйИдентификатор() + "', ?)";
        
        // Запуск
	Кмд.Execute();
...
Показать


Выходит ошибка: "Произошла исключительная ситуация (ADODB.Parameter): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом."

foto - содержит значение с типом ХранилищеЗначения.

Значения Колонки.Item(1).Type и Колонки.Item(1).DefinedSize возвращают 205 и 2147483852 соответственно.
Тип 205 согласно msdn это adLongVarBinary - Indicates a long binary value. Так же пробовал ставить:
adVarBinary 204 Indicates a binary value.
adBinary 128 Indicates a binary val ue (DBTYPE_BYTES).
Результат тот же.

Подскажите как правильно передать двоичные данные в параметр, что бы вставка записи была выполнена.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. cool.vlad4 2 06.08.15 05:40 Сейчас в теме
(1) oveksKnaaz, очевидно, что ни ADO (ни уж тем более Oracle) про тип 1С ДвоичныеДанные ничего не знают и получают на входе мусор, о чем и говорит ошибка. Передавать надо предварительно сформировав нужные данные через ADODB.Stream . Сейчас код точный не вспомню, но гугл подсказывает примерно так

adTypeText=2; 
adTypeBinary=1;
inStream=Новый COMОбъект("ADODB.Stream");
inStream.Open();
inStream.type=adTypeBinary;
inStream.LoadFromFile(ПолноеИмяФайла);
Параметр.Value = inStream.Read();


(ПолноеИмяФайла это путь к файлу, куда следует записать ДвоичныеДанные. К сожалению нормальный способ передачи ДвоичныхДанных напрямую мне неизвестен. Хотя видел как некоторые извращаются через Base64, но меня этот способ не устраивает)
5. nomad_irk 72 30.06.20 21:27 Сейчас в теме
3. de0nis 449 18.12.18 18:53 Сейчас в теме
Коллеги, получилось передать BLOB в Oracle? Заполняем значение параметра через "ADODB.Stream", параметры тип и размер через "ADOX.Catalog", как в примере.
В итоге ошибка :
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Oracle][ODBC][Ora]ORA-01008: not all variables bound
Если убрать из процедуры параметр с типом BLOB, то всё работает.
4. mcgoblin 3 30.06.20 21:16 Сейчас в теме
(1)Здравствуйте, займусь некрофилией, но не хочу создвать статью или отедельную ветку.
формат данных в таблице longblob если правильно напечатал
Вот решение как можно сделать - рабочее
ФайлДД = ФайлИзображения.Получить();  //файл изображение - ХранилищеЗначений

ЧтениеДанных=Новый ЧтениеДанных(ФайлДД);
МассивЧастей=ЧтениеДанных.РазделитьНаЧастиПо(10);//Тут можно больше, но я что бы наверняка не париться взял лишь 10 бит
ЧтениеДанных.Закрыть();
БайтКодКартинки = "";
Для каждого ЧастьБайта Из МассивЧастей Цикл
    БайтКодКартинки = БайтКодКартинки + Строка(ЧастьБайта.ПолучитьДвоичныеДанные());
КонецЦикла;
БайтКодКартинки = СтрЗаменить(БайтКодКартинки," ","");
  
мТекстЗапроса = "Insert tgbot_image(id,name, body) values (1,'imgname-DestroyAgain',0x"+БайтКодКартинки+")";
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот