Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Работа с ADO в среде 1С          
Vofka Подменю пользователя
сообщение 02.11.10, 15:31
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Что такое 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. Так я контролирую, возвращен пустой набор записей, или нет.

ЗЫ. это часть статьи, которую я для себя взял. Полная статья находится [необходимо зарегистрироваться для просмотра ссылки].

Спасибо сказали: TipsyKID,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 23:04
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!