1c adodb command с параметрами

Обновлено: 01.07.2024

Для иллюстрации работы технологии приведем пример решения типовой задачи:

1. Начальные условия.

Существует база сигналов [DB_AGK] и хранится на [AGK1] - MS SQL Server 2014 Standart, где значение каждого сигнала за период опроса хранится в отдельной таблице (количество сигналов в БД более 300). При превышении заданных пороговых значений в базу [MFSB] записывается событие с максимальным значением сигнала. Структура таблиц [MFSB] приведена на прикрепленном рисунке.

Замечание: Сервер [AGK1], содержащий таблицы сигналов, должен быть целевым сервером или быть подключенным к целевому серверу как связанный сервер.

Например, таблица [SA_SIG_0_16922_5_4] (название её совпадает с именем сигнала) содержит следующие поля:

[PK_ID_SIG] int -- (первичный ключ)
[VALUE] float -- (значение сигнала)
[TIME] int -- (время в формате Unix - кол-во секунд с 01.01.1970 г.)
[MSEC] int -- (количество микросекунд с начала секунды времени измерения)

2. Постановка задачи.

Необходимо за заданный период найти максимальное значение сигнала и вывести в 1С.

3.1 Код для SQL - стандартное решение для таких задач.

Нам приходится использовать процедуру с возвращаемым значением вместо функции, так как в функции нельзя использовать динамический SQL.

Код процедуры создаем в базе [MFSB]. Исходник приведен ниже:

3.2 Теперь рассмотрим код для 1С.

Пример приведен в виде внешней обработки с одной формой, где в поле "Источник" необходимо задать имя таблицы (сигнала).

Также необходимо выбрать период, заполним поля "Дата начала" и "Дата окончания".

При нажатии кнопки "Расчет" в поле "Результат" будет помещено максимальное значение за заданный период выбранного сигнала.

(естественно, если у вас есть эти данные :-).

Ниже помещен модуль формы.

Имеет смысл разобрать только функцию "ВыполнитьЗапросSQL". Она состоит из 4 частей:

- в первой части формируется строка подключения.

- во второй части создается COM-объект и выполняется открытие соединения.

- в третьей части формируются структура Command c 4-мя параметрами и происходит вызов метода Exicute (выполнение)

(Обратите внимание - число параметров должно быть указано как в вашей процедуре на SQL. )

- в четвертой части происходит возврат значения 4-го параметра (Parameters(3) - счет от нуля) и закрытие соединения.

Для более полного ознакомления с темой [Внешние источники данных] рекомендую статью:

"[ Внешние источники данных ] Пример интеграции базы 1С и внешней СУБД"

Добрый день!
Помогите разобраться. Создала внешнюю обработку, которая должна будет создать трассировку. Однако при вызове метода RecordSet.Open() вылетает ошибка:
: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Неправильный синтаксис около конструкции ",".

Подскажите, в чем проблема?

(18) Если речь идет о sp_trace_create, то первый параметр у нее выходной

sp_trace_create [ @traceid = ] trace_id OUTPUT
, [ @options = ] option_value
, [ @tracefile = ] 'trace_file'
[ , [ @maxfilesize = ] max_file_size ]
[ , [ @stoptime = ] 'stop_time' ]
[ , [ @filecount = ] 'max_rollover_files'

т.e. вызов ХП в может выглядеть так:

com = New COMОбъект("ADODB.Command");
com.ActiveConnection=conn;
com.CommandText ="sp_trace_create";
com.CommandType=4;
com.Parameters.Append (com.CreateParameter("@TraceID", 3, 3,4));
com.Parameters.Append (com.CreateParameter("@options", 3, 1,4));
com.Parameters(1).value =6;
com.Parameters.Append (com.CreateParameter("@tracefile", 130, 1,245));
com.Parameters(2).value =file;
com.Prepared = true;
com.Execute();
//Возвращаем значение @TraceID
id=com.Parameters(0).value;

(1) Видимо строка подключения некорректная. Покажите ее
Неправильный текст запроса - ТекстЗапроса = "exec sp_trace_create, 'C:\Projects'"; (3) А как правильно написать запрос? Может параметры не правильно задала? (5) И, если у Вас стоит exec - то это вызов какой - то хранимой процедуры? (7) да, это хранимая процедура sql, которая создает трассировку.

Результат = ADOConnection1.Execute('Set NoCount On Declare @ResultParam int Exec @ResultParam = ' + ProcName + ' Select @ResultParam As ResultParam');

(1) Пример вызова хранимой процедуры, возвращающей набор данных

Параметры функции CreateParameter:

Function CreateParameter([Name As String], [Type As DataTypeEnum = adEmpty], [Direction As ParameterDirectionEnum = adParamInput], [Size As ADO_LONGPTR], [Value]) As Parameter

Name - имя параметра хранимой процедуры
Type - тип параметра ( 3 - целое, 135 - дата, полный список типов в документации по MS ADODB)
Direction - направление передачи параметров 1 - входной, 3 - выходной
Size - размерность в байтах.


А можете поделиться ссылочкой на документацию с полным описанием типов параметров ХП?
Перерыла гугл, ничего толкового не попадается(

(13) Два варианта: "теоретический" и "практический".

1. https://docs.microsoft.com/ru-ru/sql/ado/reference/ado-api/ado-code-examples
2. Открываете книгу Excel, переходите в редактор VB (Alt+F11). Затем меню Tools -> References устанавливаете ссылку на Мicrosoft ActiveX Data Objects 2.8 Library.
Далее вызываете Оbject Browser (меню View -> Оbject Browser или F2). В списке "Project / Library выбираете ADODB.

Но, вылетает ошибка:
: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура ожидает параметр "@options" типа "int".

Что может быть не так? Перепробовала разные типы для целых чисел, ошибка одна и та же каждый раз вылетает. ((

(18) Если речь идет о sp_trace_create, то первый параметр у нее выходной

sp_trace_create [ @traceid = ] trace_id OUTPUT
, [ @options = ] option_value
, [ @tracefile = ] 'trace_file'
[ , [ @maxfilesize = ] max_file_size ]
[ , [ @stoptime = ] 'stop_time' ]
[ , [ @filecount = ] 'max_rollover_files'

т.e. вызов ХП в может выглядеть так:

com = New COMОбъект("ADODB.Command");
com.ActiveConnection=conn;
com.CommandText ="sp_trace_create";
com.CommandType=4;
com.Parameters.Append (com.CreateParameter("@TraceID", 3, 3,4));
com.Parameters.Append (com.CreateParameter("@options", 3, 1,4));
com.Parameters(1).value =6;
com.Parameters.Append (com.CreateParameter("@tracefile", 130, 1,245));
com.Parameters(2).value =file;
com.Prepared = true;
com.Execute();
//Возвращаем значение @TraceID
id=com.Parameters(0).value;

(20) Спасибо большое! Все получилось)
Однако, еще одна загвоздка: мне необходимо следом вызвать еще одну ХП sp_trace_setevent, но вылетает ошибка, что для данной процедуры слишком много аргументов, хотя в описании к этой ХП они все указаны. Подскажите, пжл, в чем может быть проблема? И как лучше задать значения параметров, если значений должно быть несколько (например, для параметра 1 и 2)?

Parameters of all SQL Trace stored procedures (sp_trace_xx) are strictly typed. If these parameters are not called with the correct input parameter data types, as specified in the argument description, the stored procedure will return an error.
Параметры 1 и 2 имеют тип int и должны задаваться со значениями (3,1,4).

И как лучше задать значения параметров, если значений должно быть несколько (например, для параметра 1 и 2)?
Users must execute sp_trace_setevent for each column added for each event. During each execution, if @on is set to 1, sp_trace_setevent adds the specified event to the list of events of the trace. If @on is set to 0, sp_trace_setevent removes the specified event from the list. Параметры 1 и 2 имеют тип int и должны задаваться со значениями (3,1,4).

Поправила, но ошибка все равно повторяется((
Может параметр @TraceID не надо указывать?

Users must execute sp_trace_setevent for each column added for each event. During each execution, if @on is set to 1, sp_trace_setevent adds the specified event to the list of events of the trace. If @on is set to 0, sp_trace_setevent removes the specified event from the list.
Т.е. получается необходимо вызывать эту процедуру, каждый раз добавляя в значение параметра по событию и столбцу к этому событию?
типа так:

Мне не удалось получить эту ошибку. На sql 2005 и 2008 процедура отрабатывает без ошибок. @TraceID - дескриптор сеанса трассировки и он нужен для sp_trace_setevent.

Т.е. получается необходимо вызывать эту процедуру, каждый раз добавляя в значение параметра по событию и столбцу к этому событию? Мне не удалось получить эту ошибку. На sql 2005 и 2008 процедура отрабатывает без ошибок. @TraceID - дескриптор сеанса трассировки и он нужен для sp_trace_setevent.
А чему параметр @TraceID долен быть равен? Значению, которое мы получили вот тут:
(20)
Может быть я не правильно значение этому параметру задала?

(25) XП sp_trace_create создает экземпляр трассировки и возвращает указатель на этот экземпляр (@TraceID). Этот указатель должен быть передан в XП sp_trace_setevent, для того, чтобы она "знала" с какой трассировкой она работает.

DECLARE @RC int, @TraceID int, @on BIT
EXEC @rc = sp_trace_create @TraceID output, 0, N'C:\SampleTrace'

-- Select the return code to see if the trace creation was successful.
SELECT RC = @RC, TraceID = @TraceID

-- Set the events and data columns you need to capture.
SELECT @on = 1

-- 10 is RPC:Completed event. 1 is TextData column.
EXEC sp_trace_setevent @TraceID, 10, 1, @on

(25) Попробуйте следующий вариант:

1. Создайте свою ХП обертку в MS-Sql:

CRE ATE procedure [dbo].[myTrace]

@pFile nvarchar(245)=null
as
--
DECLARE @RC int, @TraceID int, @on BIT
EXEC @rc = sp_trace_create @TraceID output, 6, @pFile

-- Select the return code to see if the trace creation was successful.
SELECT RC = @RC, TraceID = @TraceID

-- Set the events and data columns you need to capture.
SELECT @on = 1

-- 10 is RPC:Completed event. 1 is TextData column.
EXEC sp_trace_setevent @TraceID, 10, 1, @on
-- 13 is SQL:BatchStarting, 11 is LoginName
EXEC sp_trace_setevent @TraceID, 13, 11, @on
-- 13 is SQL:BatchStarting, 14 is StartTime
EXEC sp_trace_setevent @TraceID, 13, 14, @on
-- 12 is SQL:BatchCompleted, 15 is EndTime
EXEC sp_trace_setevent @TraceID, 12, 15, @on
-- 13 is SQL:BatchStarting, 1 is TextData
EXEC sp_trace_setevent @TraceID, 13, 1, @on

-- Start Trace (status 1 = start)
EXEC @RC = sp_trace_setstatus @TraceID, 1

В данной статье будет рассмотрено взаимодействие 1С и ADOdb. Но вначале вкратце опишем, что из себя представляет ADOdb. Итак, ADOdb – это библиотека-функция для программного обеспечения, которая создает прикладной интерфейс для способа доступа к базам данных таких языков, как Python и PHP. Данная библиотека даёт разработчику инструменты, которые позволяют делать приложения не программируя каждый возможный тип источника данных. Также используя ADOdb, программист 1С получает возможность перемены в СУБД (Система управления базами данных), не внося исправлений в главную часть кода.

ADOdb может применяться совместно с системами 1С, например, для получения доступа к таблицам в базе данных 1С при помощи методов ADO. Методы ADO и SQL-DMO разрешают исполнять командование доступом и модификацию данных при помощи функций T-SQL (расширение SQL). В обоих случаях порядок действий будет одинаковым. Рассмотрим же его подробнее!

1. Формирование объекта ADOdb.Connection

формирование объекта в ADOdb.Connection

Формирование объекта ADOdb.Connection

Реализовали мы данное действие в глобальном модуле, то есть существует объект до тех пор, пока сеанс в 1С открыт – по окончанию работы удалять не нужно.

2. Отправка команды серверу

Привязка объекта ADOdb.Connection к соединению

Привязка объекта ADOdb.Connection к соединению

Далее задаётся непосредственно команда:

 ADOdb.Connection тип команды

Команда для объекта ADOdb.Connection

Текст в команде – это некий оператор из T-SQL или имя процедуры из нашей базы данных.

Чтобы работа программы стала быстрее? можно отметить для объекта ADOdb тип команды (функция «ТипКомандыАдо()»).

Как отметить для объекта ADOdb.Connection тип команды

Как отметить для объекта ADOdb.Connection тип команды



Тип команды по умолчанию для объекта ADOdb.Connection

«CreateParamerer (Name, Value Type, Param type, Param Value)», где:

· Name – название параметра (точно так же, как указано в процедуре, в которой он хранится);

· Value Type – значение параметра по типу, определяем при помощи КонстантаАДО();

· Param Type – тип в параметре («Output» или «Input»), определяем при помощи функции ТипПарамедраАДО();

· Param Value – само значение.

создание в объекте ADOdb.Command

Функция CreateParameter в объекте ADOdb.Command

Для того чтобы передать параметры в процедуру для хранения, нужно сделать описание каждого параметра в том же порядке, как они записаны в процедуре, где хранятся.

Примечание: параметры с типом Numeric нужно будет конвертировать в строки, а только потом передавать.

3. Получение и обработка результата работы команды

Можно вывести результаты двумя способами:

· как обособленные значения, которые можно передать из той процедуры, где они хранятся, по параметрам с типом OUTPUT.

Выведение результатов работы ADOdb.Command

Стоит обратить внимание, что параметры нумеруются начиная со значения «0». Параметры можно использовать ещё раз, если присвоить им значения через опцию Value.

Конечный набор с записями сможет проходить обработку с начала и до конца цикла и будет обращаться к полям по их названиям. Например:

Обработка набора с начала и до конца года

Обработка набора с начала и до конца года

Когда записи стали не нужными, закрываем их с помощью Rs.Close.

Таким образом, соединив 1С и методы ADOdb, мы получили набор записей при работе с базой данных SQL.

Vofka --> Vofka



Просмотр профиля

Что такое ADO и с чем его едят уже достаточно подробно описано. Я хочу привести примеры доступа к SQL-таблицам базы данных 1С-Предприятие с помощью методов ADO

Методы ADO и SQL-DMO позволяют выполнять команды доступа и модификации данных с помощью языка Т-SQL. И в том, и в другом случае работа состоит из следующих этапов:
1. Соединение с базой данных.
2. Отправка серверу команды.
3. Получение и обработка результатов выполнения команды.

1. Создать объект ADODB.Connection

У меня это реализовано в глобальном модуле (при начале работы системы автоматически устанавливается соединение и существует, пока открыт сеанс 1С). Уничтожение объекта после окончания работы не требуется.

2. Формирование и отправка команды дла SQL-сервера.

Для задания команды используется свойство CommandText:

Текстом команды может быть оператор Т-SQL (SELECT, INSERT, UPDATE, DELETE и т.д), или имя хранимой процедуры из той базы данных, с которой установлено соединение.

Существенного ускорения работы при указании типа команды я не заметил, но всегда указываю его, считая это правилом хорошего тона.

Для определения типа значения параметра и типа параметра я использую функции КонстантаАДО() и ТипПараметраАДО() соответственно, прописанные в глобальный модуль:

Для передачи параметров в хранимую процедуру необходимо описать все параметры в том порядке и с теми типами, как они описаны в хранимой процедуре.

Реально я использовал передачу и возврат параметров типа AdChar, AdWChar (строковые), AdDate (дата), AdInteger, AdTinyInt ( целочисленные). Параметры типа Numeric приходилось передавать, конвертируя их в строки.

3. Получение и обработка результатов

После того, как набор записей уже не нужен, его нужно закрыть:

Когда я использую методы ADO для получения набора записей , в один из выходных параметров процедуры я помещаю результат работы функции @@ROWCOUNT. Так я контролирую, возвращен пустой набор записей, или нет.

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

Читайте также: