Взаимодействие 1С с ADODB
>> 30 мая 2013 г.
Пришлось недавно ближе поработать с объектами ADODB. Давно этого не делал, так что пришлось снова смотреть в старый код, а что-то и в интернете поискать. Решил скомпоновать базу здесь, в блоге - для дальнейшего возвращения.
Работа с ADODB производится через несколько объектов:
ADODB.Connection - Объект производит подключение к источнику данных, а так же трансляцию команд и наборов данных
ADODB.RecordSet - Объект предоставляющий механизмы работы с набором данных, такие как получение, модификация, удаление или добавление данных.
ADODB.Command - Объект, так же предоставляющий механизмы работы с наборами данных, но, в отличие от RecordSet, не возвращает данные на клиента.
ADODB.Connection
Перед тем как начать работать с данными из внешнего источника необходимо установить с ним связь, для этого вызывается функция Open объекта Connection, в единственный параметр этой функции передается строка ConnectionString с описанием параметров подключения.Попытка
ADOСоединение = Новый COMОбъект("ADODB.Connection");
ADOСоединение.Open("Provider=SQLOLEDB.1;
|Persist Security Info=False;
|User ID="+Пользователь+";
|Password="+ Пароль+";
|Initial Catalog="+ База+";
|Data Source="+ Сервер);
Возврат ADOСоединение;
Исключение
КонецПопытки;
Provider - Имя драйвера источника данных (к примеру SQLOLEDB.1 для MS SQL server)
Persist Security Info - необходимость использования шифрованого канала
User ID - Имя пользователя внешнего источника
Password - Пароль пользователя
Initial Catalog - Имя базы внешного источника
Data Source - Имя сервера
ADODB.RecordSet
Открытие набора данных для всей таблицы. Этот вариант хорош тем, что есть возможность указания дополнительных параметров набора данных.
RecordSet.Open(Источник, Соединение, ТипКурсора, ТипБлокировки, Параметры)
В приведенном ниже примере набор данных открывается с параметрами
Источник - "IMPORT_PRODUCTS"
Соединение - мADOСоединение
ТипКурсора - "0" (adOpenForwardOnly)
ТипБлокировки - "2" (adLockPessimistic)
Параметры - "2" (adCmdTable)
ADOНаборДанныхТовары = Новый COMОбъект("ADODB.RecordSet");
ADOНаборДанныхТовары.Open("IMPORT_PRODUCTS", мADOСоединение, 0, 2, 2);
Открытие набора данных по запросу (использование дополнительных параметров вызывает исключения)
ТекстЗапросаТоваров = "SELECT *
| FROM [IMPORT_PRODUCTS]
| where[orders_id] in (SELECT [orders_id] FROM [IMPORT_ORDERS] where (([orders_UUID] = '')
|or ([orders_UUID] = 'NULL') or([modified] = '1')))";
ADOНаборДанныхТовары = Новый COMОбъект("ADODB.RecordSet");
ADOНаборДанныхТовары .Open(ТекстЗапросаТоваров, мADOСоединение);
Заполнение внешней таблицы
При необходимости очистить таблицу внешнего источника данных, и загрузить туда обновленные данные.
Подключаемся к внешней базе
Попытка СтрокаСоединения = "Provider=SQLOLEDB.1; |Persist Security Info=False; |User ID="+Пользователь+"; |Password="+ Пароль+"; |Initial Catalog="+ База+"; |Data Source="+ Сервер); Connection = Новый COMОбъект("ADODB.Connection"); Connection.Open(СтрокаСоединения); Исключение Возврат; КонецПопытки;
С помощью объекта ADODB.Command выполняем запрос по удалению данных из таблицы по определенному условию. При этом, в CommandText прописываем сам запрос, и важно указать CommandType равным 1.Command = Новый COMОбъект("ADODB.Command");
Command.CommandTimeout = 100;
Command.CommandText = "DELETE FROM [TEST_BASE].[dbo].[TBL_1] WHERE PERIOD_ID = Convert(datetime,'"+Лев(Строка(ДатаНач),10)+"',103)";
Command.CommandType = 1;
Command.ActiveConnection = Connection;
Command.Execute();
Устанавливаем новый запрос, который запишет в таблицу отобранные данные, и выполняем его.
// Выборка данных за прошлый месяц Выборка = Запрос.Выполнить.Выбрать(); Пока Выборка.Следующий() Цикл Command.CommandText = "INSERT INTO [TEST_BASE].[dbo].[TBL_1](PERIOD_ID, CO_ID, ART_ID, S ) VALUES (" + " Convert(datetime,'"+Лев(Строка(ДатаНач),10)+"',103)" + ",NULL" + ","+Формат(Выборка.Код, "ЧГ=") + ","+Строка(?(Сумма = 0,"0",Формат(Сумма,"ЧРД=.; ЧГ=; ЧО="))) +")"; Попытка Command.Execute(); Исключение Сообщить("Ошибка записи данных в базу: "+ОписаниеОшибки()); КонецПопытки; КонецЦикла;
Выборка данных и запись
Вариант ситуации, когда необходимо выполнить выборку данных, и записать результат для дальнейшей обработки. (Не забываем создавать объект Connection)
В данном случае используется объект ADODB.Recordset, который позволяет получить набор записей.
CommandText = "select g_id, saledate, sqty, scost from dbo."+НастройкиADODB.dbo+"('"+Формат(НачПериода,"ДФ=yyyyMMdd")+"','"+Формат(КонПериода,"ДФ=yyyyMMdd")+"') where g_id in ("+СтрокаКодовТМЦ+")";
Попытка
rsRES = NEW COMObject("ADODB.Recordset");
rsRES.Open(CommandText, Connection);
Исключение
Connection.Close();
Возврат;
КонецПопытки
Пока не rsRES.eof() Цикл
НоваяЗапись = НаборЗаписей.Добавить();
Для х = 0 по 3 Цикл
НоваяЗапись["Колонка"+(х+1)] = rsRES.Fields(х).Value;
КонецЦикла;
rsRES.MoveNext();
КонецЦикла;
НаборЗаписей.Записать(Истина);
rsRES.Close();
Connection.Close();
Кстати, советую пользоваться функцией EOF вместо RecordCount, так как последняя очень не надежна, неопределенная во времени выполнения и может привести к "залипанию" процесса - подробнее можно почитать на форумах.
Использование хранимых процедур
Хранимые процедуры можно вызвать просот из запроса, вписав в начале текста слово "exec", либо указав соответствующий CommandType и название хранимой процедуры в CommandText.
Command = Новый COMОбъект("ADODB.Command");
Command.CommandTimeout = 100;
Command.ActiveConnection = Connection;
Command.CommandText = "add_image";
Command.CommandType = 4;
Создаем параметр посредством объекта Parameter (на перевес этому можно воспользоваться методом CreateParameter), и добавляем его методом Append в наше подключение.Парам = Новый COMОбъект("ADODB.Parameter");
Парам.Name = "@code";
Парам.Direction = 1; //1 - adParamInput
Парам.Type = 201; //
Парам.Size = 255;
Парам.Value = ВнутреннийКод;
Command.Parameters.Append(Парам);
Переводим файл, который хотим передать в двоичный поток, создаем и добавляем параметр
Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1; //StreamTypeEnum.adTypeBinary = 1 StreamTypeEnum.adTypeText = 2
Поток.Open();
Поток.LoadFromFile(ПолноеИмяФайла);
локПотокБайт = Новый ComSafeArray(Поток.Read());
Парам = Новый COMОбъект("ADODB.Parameter");
Парам.Name = "@file_data";
Парам.Direction = 1; //1 - adParamInput
Парам.Type = 205; //205 - adLongVarBinary
Парам.Size = локПотокБайт.GetLength();
Парам.Value = локПотокБайт;
Command.Parameters.Append(Парам);
Command.Execute();
Источники
MSDN Libraryw3schools - ADO CreateParameter Method
Взаимодействие 1С с ADODB
Запуск хранимых процедур с 1с 8.1 (mista.ru)
ADO и SQL Server. Руководство разработчика.
2 коммент.:
Я хочу поделиться свидетельством о том, как г-н Бенджамин помог мне с займом в 2 000 000,00 долларов США для финансирования моего проекта по выращиванию марихуаны, я очень благодарен и пообещал поделиться этой законной финансирующей компанией с любым, кто ищет способ расширить свой бизнес-проект. .финансирующая компания. Любой, кто ищет финансовую поддержку, должен связаться с ними по адресу lfdsloans@outlook.com. Г-н Бенджамин также работает в WhatsApp + 1-989-394-3740, чтобы облегчить задачу любому заявителю.
Если таким образом обратиться к Excel, то как можно получить список листов. Видимо это будет список таблиц.
Отправить комментарий