Технологии Blogger.

Взаимодействие 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 Library
w3schools - ADO CreateParameter Method
Взаимодействие 1С с ADODB
Запуск хранимых процедур с 1с 8.1 (mista.ru)
ADO и SQL Server. Руководство разработчика.

Отправить комментарий

  © Blogger template Simple n' Sweet by Ourblogtemplates.com 2009

Back to TOP