Добрый день!
В разделе создано действие, при нажатии на которое запускается бизнес-процесс.
Смысл бизнес-процесса состоит в том, что в нем необходимо вызвать хранимую процедуру.
Т.е. бизнес-процесс состоит из трех элементов:
начальное простое событие
задание-сценарий
завершающее событие.
Вопросы:
1) как правильно вызвать хранимую процедуру
StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "tsp_test") as StoredProcedure;
storedProcedure.PackageName = UserConnection.DBEngine.SystemPackageName;
storedProcedure.Execute();
return true;
подобный скрипт вызывает ошибки синтаксиса..
как правильно оформить вызов хранимой процедуры
2) как правильно передавать параметры входящие в процедуру(вызывать процедуру с параметрами)
и как правильно получить исходящие параметры хранимой процедуры
3) как правильно передавать в скрипте параметры БП во входящие параметры хранимой процедуры
4) где можно в конфигурации стандартной посмотреть вызов хранимой процедуры ( у вас есть несколько хранимых процедур в конфигурации, где можно посмотреть вызов и использование хотя бы одной из них)
Нравится
Добрый день, Дарья!
1) Правильный вызов процедуры (пример):
DataValueTypeManager dataValueTypeManager = UserConnection.DataValueTypeManager; var dateTimeValue = new DateTime(2009, 01, 02, 22, 12, 0); Stream stream = new MemoryStream(Encoding.Unicode.GetBytes("Тест большого бинарного объекта")); var textDataValueType = new TextDataValueType(dataValueTypeManager); var guidDataValueType = new GuidDataValueType(dataValueTypeManager); var integerDataValueType = new IntegerDataValueType(dataValueTypeManager); var floatDataValueType = new Float2DataValueType(dataValueTypeManager); var booleanDataValueType = new BooleanDataValueType(dataValueTypeManager); var dateTimeDataValueType = new DateTimeDataValueType(dataValueTypeManager); var idValue = new Guid("{BCDB8392-55BC-472A-A49D-22A975E0BEF6}"); StoredProcedure storedProcedure = new StoredProcedure(Page.UserConnection, "tsp_TestStoredProcedure") .WithParameter("IdParameter", idValue) .WithVarParameter("VarIdParameter", idValue, guidDataValueType) .WithParameter("TextParameter", "Украина") .WithVarParameter("VarTextParameter", "Украина", textDataValueType) .WithParameter("IntegerParameter", 10) .WithVarParameter("VarIntegerParameter", 10, integerDataValueType) .WithParameter("FloatParameter", 3.14) .WithVarParameter("VarFloatParameter", 3.14, floatDataValueType) .WithParameter("BooleanParameter", true) .WithVarParameter("VarBooleanParameter", false, booleanDataValueType) .WithParameter("DateTimeParameter", dateTimeValue) .WithVarParameter("VarDateTimeParameter", dateTimeValue, dateTimeDataValueType) .WithParameter("BinaryParameter", stream) .WithVarParameter("VarBinaryParameter", stream) .WithOutputParameter("ResultParameter", textDataValueType) as StoredProcedure; storedProcedure.PackageName = Page.UserConnection.DBEngine.SystemPackageName; storedProcedure.Execute();
2. Исходящий параметр .WithOutputParameter
3. Передача параметров в хранимую процедуру описана в первом пункте.
4. Вызов хранимой процедуры, Вы можете посмотреть в BaseAdministrativeGridPage
Спасибо.
по поводу пункта № 1- как правильно вызвать процедуру.
) Вызываю по аналогии в сценарии в БП
(процедура пока без параметров)
StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "tsp_test") as StoredProcedure;
storedProcedure.PackageName = UserConnection.DBEngine.SystemPackageName;
storedProcedure.Execute();
return true;
Выходит ошибка при публикации (см. вложение).
Что не так?
2) по поводу пункта № 3 - не поняла.
Как передать просто параметры входящие - понятно.
Но как в скрипте правильно обратить к параметру бизнес-процесса, чтобы его уже значение передать в параметр хранимой процедуры ?
3) где именно искать вызов хранимой процедуры в BaseAdministrativeGridPage?
1. Код помещенный в БП в ScriptTask:
StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "tsp_test") as StoredProcedure;
storedProcedure.PackageName = UserConnection.DBEngine.SystemPackageName;
storedProcedure.Execute();
return true;
не вызывает ошибки компиляции. Возможно у Вас есть еще какой-то код, который приводит к ошибке?
2. По имени параметра
var temp = ProcessSchemaParameter1
3. Поиском в исходных кодах
Открыть схему. Кнопка «Дополнительно» пункт меню «Открыть исходный код»
Применение конструкции
.WithOutputParameter("ResultParameter", textDataValueType)
позволяет вызвать процедуру с исходящими параметрами.
Скажите, пожалуйста, как потом после выполнения обратиться к значению этого исходящего параметра?
Добрый день, Дарья!
Вы можете обратиться к значению, используя следующий пример кода:
var resultParameter = (string) storedProcedure.Parameters.FindByName("ResultParameter ").Value;
Добрый день еще раз!
Пытаюсь опять вызвать процедуру согласно инструкции (в БП в задании-сценарии)
DataValueTypeManager dataValueTypeManager = UserConnection.DataValueTypeManager;
var textDataValueType = new TextDataValueType(dataValueTypeManager);
StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "tsp_test")
.WithOutputParameter("res_msg",textDataValueType) as StoredProcedure;
storedProcedure.PackageName = UserConnection.DBEngine.SystemPackageName;
storedProcedure.Execute();
return true;
Текст процедуры выглядит так:
CREATE procedure [dbo].[tsp_test]
as declare @res_msg nvarchar(250);
select @res_msg='1'
select @res_msg as res_msg
Процесс компилируется, но при запуске процесса элемент сценарий завершается с ошибкой
"System.Data.SqlClient.SqlException (0x80131904): Процедуре tsp_test не переданы параметры и аргументы"
О каких параметрах и аргументах может идти речь, если у процедуры этой нет вовсе входящих параметров, которые можно было бы передать?
Причем если вызвать процедуру без исходящего параметра
StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "tsp_test")
as StoredProcedure;
то такой ошибки нет, сценарий выполняется.
Что-то не так с получением исходящего параметра процедуры?
Поняла в чем дело:
чтобы использовать конструкцию .WithOutputParameter("ResultParameter", textDataValueType) as StoredProcedure в скрипте,
необходимо в тексте самой процедуры прописывать параметр как OUTPUT:
CREATE procedure [dbo].[tsp_test]
(@res_msg nvarchar(250) OUTPUT)
as
select @res_msg='1'
select @res_msg as res_msg
return @res_msg
Но скажите тогда, как получить результат процедуры, если ее результатом будет какая-то выборка?
например, если результат ее выполнения - это результат выполнения какого-то запроса, возвращающего набор данных.
OUT | OUTPUT
Показывает, что параметр процедуры является выходным. Используйте параметры OUTPUT для возврата значений в вызвавший процедуру код.
В.Использование выходных параметров (OUTPUT)
В следующем примере создается процедура uspGetList. Эта процедура возвращает список товаров, цена на которые не превышает указанный предел. Данный пример поясняет использование нескольких инструкций SELECT и нескольких параметров OUTPUT. Параметры OUTPUT предоставляют внешней процедуре, пакету или нескольким инструкциям Transact-SQL доступ к значениям, заданным во время выполнения процедуры.
IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL DROP PROCEDURE Production.uspGetList; GO CREATE PROCEDURE Production.uspGetList @Product varchar(40) , @MaxPrice money , @ComparePrice money OUTPUT , @ListPrice money OUT AS SET NOCOUNT ON; SELECT p.[Name] AS Product, p.ListPrice AS 'List Price' FROM Production.Product AS p JOIN Production.ProductSubcategory AS s ON p.ProductSubcategoryID = s.ProductSubcategoryID WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice; -- Populate the output variable @ListPprice. SET @ListPrice = (SELECT MAX(p.ListPrice) FROM Production.Product AS p JOIN Production.ProductSubcategory AS s ON p.ProductSubcategoryID = s.ProductSubcategoryID WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice); -- Populate the output variable @compareprice. SET @ComparePrice = @MaxPrice; GO
Источник: https://msdn.microsoft.com/ru-ru/library/ms187926.aspx#Parameters
Спасибо, но вопрос не в этом заключался. Процедура, которую вы привели, просто возвращает два параметра выходных, а не выборку данных
А меня интересовало получение результатов выполнения процедуры в скрипте в bpmonline.
Например, процедура возвращает результат выполнения запроса select * from tbl_city
(это просто пример, выборка может быть сложнее), интересовало получение результата выполнения процедуры в bpmonline.
Но, наверное, мой вопрос уже не связан с темой бизнес-процессов - озвучу его в другой теме.
Спасибо
Добрый день, Дарья!
Для получения результата запроса из процедуры необходимо в процессе добавить в Usings:
Пространство имен: System.Data.IDataReader
Псевдоним: IDataReader
Вызов процедуры:
StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "Test") as StoredProcedure; storedProcedure.PackageName = UserConnection.DBEngine.SystemPackageName; using (var dbExecutor = UserConnection.EnsureDBConnection()) { using (IDataReader dataReader = storedProcedure.ExecuteReader(dbExecutor)) { while (dataReader.Read()) { var valueColumn1 = dataReader.GetValue(0); var operation = dataReader.GetColumnValue<int>("Operation"); } } }