Что такое ADO и с чем его едят уже достаточно подробно описано. Я хочу привести примеры доступа к SQL-таблицам базы данных 1С-Предприятие с помощью методов ADO
Методы ADO и SQL-DMO позволяют выполнять команды доступа и модификации данных с помощью языка Т-SQL. И в том, и в другом случае работа состоит из следующих этапов:
1. Соединение с базой данных.
2. Отправка серверу команды.
3. Получение и обработка результатов выполнения команды.
Как это сделать (ADO)
1. Создать объект ADODB.ConnectionСоединение = СоздатьОбъект("ADODB.Connection");
ConnectionString = "driver={SQL Server}; server=myserver; uid=mylogin;
pwd= myPasword; Database = myDatabase”;
Соединение.ConnectionTimeOut =600;
Соединение.CursorLocation = 3;
try
Соединение.Open(ConnectionString);
except
Предупреждение("Невозможно установить соединение”);
endtry;
У меня это реализовано в глобальном модуле (при начале работы системы автоматически устанавливается соединение и существует, пока открыт сеанс 1С). Уничтожение объекта после окончания работы не требуется.
2. Формирование и отправка команды дла SQL-сервера.Для формирования и отправки команды серверу необходимо создать объект ADODB.Command и связать его с текущим соединением.
Cmd = СоздатьОбъект("ADODB.Command");
Cmd.ActiveConnection = Соединеиие;
Для задания команды используется свойство CommandText:
Cmd.CommandText = текст_команды;
Текстом команды может быть оператор Т-SQL (SELECT, INSERT, UPDATE, DELETE и т.д), или имя хранимой процедуры из той базы данных, с которой установлено соединение.
Пример: Cmd.CommandText = ”SELECT * FROM _1SACCS”; //Оператор Т-SQL
Cmd.CommandText = ”my_stored_proc”; //Хранимая процедура
Для ускорения работы можно указать экземпляру объекта ADODB.Command тип команды, которая будет выполняться. Для этого я использую функцию ТипКомандыАдо():
Функция ТипКомандыАДО( АдоКонст ) Экспорт
АдоКонст = Нрег(АдоКонст);
Если АдоКонст = «adcmdtext» тогда возврат 1; //для оператора T-SQL
ИначеЕсли АдоКонст = «adcmdtable» тогда возврат 2;
ИначеЕсли АдоКонст = «adcmdstoredproc» тогда возврат 4; //для хранимой процедуры
Иначе Возврат 8; //adcmdunknown
КонецФункции
По умолчанию при создании экземпляра AdoDB.Command устанавливается тип adCmdUnknown (8)
Пример:cmd.CommandType = ТипКомандыАДО("adCmdStoredProc");
Существенного ускорения работы при указании типа команды я не заметил, но всегда указываю его, считая это правилом хорошего тона.
Если используется хранимая процедура с параметрами, тогда необходимо добавить их в коллекцию Parameters объекта ADODB.Command:
Параметры создаются с помощью функции CreateParameter объекта ADODB.Command
CreateParameter (Name, Value_Type, Param_type, Param_Value)
Где Name – имя параметра. Как оно указано в хранимой процедуре
Value_Type – тип значения параметра
Param_Type – тип параметра (Input или Output)
Param_Value – собственно значениеДля определения типа значения параметра и типа параметра я использую функции КонстантаАДО() и ТипПараметраАДО() соответственно, прописанные в глобальный модуль:
Функция КонстантаАДО( Конст ) Экспорт
АдоКонст = НРег(Конст);
Если АдоКонст = "adEmpty" тогда Возврат 0;
иначеесли АдоКонст = "adtinyint" тогда Возврат 16;
иначеесли АдоКонст = "adsmallint" тогда Возврат 2;
иначеесли АдоКонст = "adinteger" тогда Возврат 3;
иначеесли АдоКонст = "adbigint" тогда Возврат 20;
иначеесли АдоКонст = "adunsignedtinyint" тогда Возврат 17;
иначеесли АдоКонст = "adunsignedsmallint" тогда Возврат 18;
иначеесли АдоКонст = "adunsignedint" тогда Возврат 19;
иначеесли АдоКонст = "adunsignedbigint" тогда Возврат 21;
иначеесли АдоКонст = "adsingle" тогда Возврат 4;
иначеесли АдоКонст = "addouble" тогда Возврат 5;
иначеесли АдоКонст = "adcurrency" тогда Возврат 6;
иначеесли АдоКонст = "addecimal" тогда Возврат 14;
иначеесли АдоКонст = "adnumeric" тогда Возврат 131;
иначеесли АдоКонст = "adboolean" тогда Возврат 11;
иначеесли АдоКонст = "aderror" тогда Возврат 10;
иначеесли АдоКонст = "aduserdefined" тогда Возврат 132;
иначеесли АдоКонст = "advariant" тогда Возврат 12;
иначеесли АдоКонст = "adidispatch" тогда Возврат 9;
иначеесли АдоКонст = "adiunknown" тогда Возврат 13;
иначеесли АдоКонст = "adguid" тогда Возврат 72;
иначеесли АдоКонст = "addate" тогда Возврат 7;
иначеесли АдоКонст = "addbdate" тогда Возврат 133;
иначеесли АдоКонст = "addbtime" тогда Возврат 134;
иначеесли АдоКонст = "addbtimestamp" тогда Возврат 135;
иначеесли АдоКонст = "adbstr" тогда Возврат 8;
иначеесли АдоКонст = "adchar" тогда Возврат 129;
иначеесли АдоКонст = "advarchar" тогда Возврат 200;
иначеесли АдоКонст = "adlongvarchar" тогда Возврат 201;
иначеесли АдоКонст = "adwchar" тогда Возврат 130;
иначеесли АдоКонст = "advarwchar" тогда Возврат 202;
иначеесли АдоКонст = "adlongvarwchar" тогда Возврат 203;
иначеесли АдоКонст = "adbinary" тогда Возврат 128;
иначеесли АдоКонст = "advarbinary" тогда Возврат 204;
иначеесли АдоКонст = "adlongvarbinary" тогда Возврат 205;
иначе возврат 0;
конецесли;
КонецФункции
Функция ТипПараметраАДО( Конст ) Экспорт
АдоКонст = НРег(Конст);
Если АдоКонст = "adparamunknown" тогда Возврат 0;
иначеесли АдоКонст = "adparaminput"тогда Возврат 1;
иначеесли АдоКонст = "adparamoutput"тогда Возврат 2;
иначеесли АдоКонст = "adparaminputoutput"тогда Возврат 3;
иначеесли АдоКонст = "adparamreturnvalue"тогда Возврат 4;
КонецЕсли;
КонецФункции
Пример:prm1 = Cmd.CreateParameter("ID", КонстантаАДО("adWChar"),
ТипПараметраАДО("adParamInput"), 9, Код);
Cmd.Parameters.Append( prm1 );
Prm2 = Cmd.CreateParameter("OUTID", КонстантаАДО("adWChar"),
ТипПараметраАДО("adParamOutpt"), 9, Код);
Cmd.Parameters.Append( prm2 );
Для передачи параметров в хранимую процедуру необходимо описать все параметры в том порядке и с теми типами, как они описаны в хранимой процедуре.
Реально я использовал передачу и возврат параметров типа AdChar, AdWChar (строковые), AdDate (дата), AdInteger, AdTinyInt ( целочисленные). Параметры типа Numeric приходилось передавать, конвертируя их в строки.
3. Получение и обработка результатовРезультаты можно получать следующими путями:
— набор данных возвращается функцией Execute объекта ADODB.Command
— отдельные значения можно передавать из хранимой процедуры через параметры типа OUTPUT.
Пример:Rs = CreateObject(”ADODB.RecordSet”);
Rs = Cmd.Execute; //Выполнение и получение набора данных
ВыхПарам = Cmd.Parameters(1).Value; //чтение параметра типа OUTPUT после выполнения.
— Нумерация параметров внутри коллекции Parameters начинается с 0 !!!
— Подготовленные 1 раз параметры можно использовать повторно, присваивая им значение через свойство Value.
Результирующий набор записей может обрабатываться в цикле с начала до конца, обращаясь к полям по их именам. В наборе записей не должны присутствовать поля типа Numeric — их необходимо преобразовывать в строковые непосредственно внутри SELECT или хранимой процедуры.
Пример:Rs.MoveFirst();
Пока Rs.EOF() = 0 do
Value1 = Rs.Fields("FieldName1”).Value;
Value2 = Rs.Fields("FieldName2”).Value;
Rs.MoveNext();
КонецЦикла;
После того, как набор записей уже не нужен, его нужно закрыть:
Rs.Close();
Когда я использую методы ADO для получения набора записей , в один из выходных параметров процедуры я помещаю результат работы функции @@ROWCOUNT. Так я контролирую, возвращен пустой набор записей, или нет.
ЗЫ. это часть статьи, которую я для себя взял. Полная статья находится [необходимо зарегистрироваться для просмотра ссылки].