Выгрузка картинки из ХранилищеЗначения 1С в blob поле в Oracle
Стоит задача передавать фотографии физ. лиц хранящиеся в реквизите с типом ХранилищеЗначения из 1С во внешную БД под управлением Oracle. Пробую выгрузить через ADO. В БД создана таблица "people" с полями GD тип varchar2 для хранения идентификатора физ. лица и foto тип blob для фотографии. Код выгрузки примерно такой:
Выходит ошибка: "Произошла исключительная ситуация (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).
Результат тот же.
Подскажите как правильно передать двоичные данные в параметр, что бы вставка записи была выполнена.
...
// Сознание команды для запроса на вставку строки
Кмд = Новый 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).
Результат тот же.
Подскажите как правильно передать двоичные данные в параметр, что бы вставка записи была выполнена.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) oveksKnaaz, очевидно, что ни ADO (ни уж тем более Oracle) про тип 1С ДвоичныеДанные ничего не знают и получают на входе мусор, о чем и говорит ошибка. Передавать надо предварительно сформировав нужные данные через ADODB.Stream . Сейчас код точный не вспомню, но гугл подсказывает примерно так
(ПолноеИмяФайла это путь к файлу, куда следует записать ДвоичныеДанные. К сожалению нормальный способ передачи ДвоичныхДанных напрямую мне неизвестен. Хотя видел как некоторые извращаются через Base64, но меня этот способ не устраивает)
adTypeText=2;
adTypeBinary=1;
inStream=Новый COMОбъект("ADODB.Stream");
inStream.Open();
inStream.type=adTypeBinary;
inStream.LoadFromFile(ПолноеИмяФайла);
Параметр.Value = inStream.Read();
(ПолноеИмяФайла это путь к файлу, куда следует записать ДвоичныеДанные. К сожалению нормальный способ передачи ДвоичныхДанных напрямую мне неизвестен. Хотя видел как некоторые извращаются через Base64, но меня этот способ не устраивает)
Коллеги, получилось передать BLOB в Oracle? Заполняем значение параметра через "ADODB.Stream", параметры тип и размер через "ADOX.Catalog", как в примере.
В итоге ошибка :
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Oracle][ODBC][Ora]ORA-01008: not all variables bound
Если убрать из процедуры параметр с типом BLOB, то всё работает.
В итоге ошибка :
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Oracle][ODBC][Ora]ORA-01008: not all variables bound
Если убрать из процедуры параметр с типом BLOB, то всё работает.
(1)Здравствуйте, займусь некрофилией, но не хочу создвать статью или отедельную ветку.
формат данных в таблице longblob если правильно напечатал
Вот решение как можно сделать - рабочее
формат данных в таблице longblob если правильно напечатал
Вот решение как можно сделать - рабочее
ФайлДД = ФайлИзображения.Получить(); //файл изображение - ХранилищеЗначений
ЧтениеДанных=Новый ЧтениеДанных(ФайлДД);
МассивЧастей=ЧтениеДанных.РазделитьНаЧастиПо(10);//Тут можно больше, но я что бы наверняка не париться взял лишь 10 бит
ЧтениеДанных.Закрыть();
БайтКодКартинки = "";
Для каждого ЧастьБайта Из МассивЧастей Цикл
БайтКодКартинки = БайтКодКартинки + Строка(ЧастьБайта.ПолучитьДвоичныеДанные());
КонецЦикла;
БайтКодКартинки = СтрЗаменить(БайтКодКартинки," ","");
мТекстЗапроса = "Insert tgbot_image(id,name, body) values (1,'imgname-DestroyAgain',0x"+БайтКодКартинки+")";
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот