From 70dc52139d64ec8638330fba1859ba7a1ba4adad Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 27 Mar 2026 14:58:56 +0100 Subject: [PATCH] Refactor SQL param and command construction in procedures Refactored InsertObject, UpdateObject, and DeleteObject procedure handlers to dynamically build SQL command strings and parameter lists. Introduced local Add functions to include only non-null parameters, improving code clarity and reducing unnecessary SQL parameter passing. The logic for handling stored procedure results and exceptions remains unchanged. --- .../DeleteProcedure/DeleteObjectProcedure.cs | 40 ++-- .../InsertProcedure/InsertObjectProcedure.cs | 186 +++++++----------- .../UpdateProcedure/UpdateObjectProcedure.cs | 183 +++++++---------- 3 files changed, 165 insertions(+), 244 deletions(-) diff --git a/src/ReC.Application/Common/Procedures/DeleteProcedure/DeleteObjectProcedure.cs b/src/ReC.Application/Common/Procedures/DeleteProcedure/DeleteObjectProcedure.cs index 079f1fa..ecc2721 100644 --- a/src/ReC.Application/Common/Procedures/DeleteProcedure/DeleteObjectProcedure.cs +++ b/src/ReC.Application/Common/Procedures/DeleteProcedure/DeleteObjectProcedure.cs @@ -36,29 +36,33 @@ public class DeleteObjectProcedureHandler(IRepository repo, IOptionsMonitor Handle(DeleteObjectProcedure request, CancellationToken cancel) { - var parameters = new[] + var execSql = new StringBuilder("EXEC @RC = [dbo].[PRREC_DELETE_OBJECT]"); + var parameters = new List(); + var separator = ' '; + + void Add(string name, object? value) { - new SqlParameter("@pENTITY", request.Entity ?? (object)DBNull.Value), - new SqlParameter("@pSTART", request.Start.ToString()), - new SqlParameter("@pEND", request.End.ToString()), - new SqlParameter("@pFORCE", (object?)request.Force ?? DBNull.Value) - }; + if (value is null) return; + execSql.AppendLine($"{separator}@{name} = @{name}"); + separator = ','; + parameters.Add(new SqlParameter($"@{name}", value)); + } + + Add("pENTITY", request.Entity); + Add("pSTART", request.Start.ToString()); + Add("pEND", request.End.ToString()); + Add("pFORCE", request.Force); + + var sql = new StringBuilder() + .AppendLine("DECLARE @RC SMALLINT = 0;") + .Append(execSql).AppendLine(";") + .AppendLine("SELECT @RC;") + .ToString(); try { - var sql = new StringBuilder() - .AppendLine("DECLARE @RC SMALLINT = 0;") - .AppendLine("EXEC @RC = [dbo].[PRREC_DELETE_OBJECT]") - .AppendLine(" @pENTITY = @pENTITY,") - .AppendLine(" @pSTART = @pSTART,") - .AppendLine(" @pEND = @pEND,") - .AppendLine(" @pFORCE = @pFORCE;") - .AppendLine("SELECT @RC;") - .ToString(); + var result = await repo.ExecuteQueryRawAsync(sql, parameters.ToArray(), cancel); - var result = await repo.ExecuteQueryRawAsync(sql, parameters, cancel); - - // The stored procedure returns 0 on success, error codes > 0 on failure if (result > 0) { throw new DeleteObjectFailedException(request, $"DeleteObject stored procedure failed with error code: {result}"); diff --git a/src/ReC.Application/Common/Procedures/InsertProcedure/InsertObjectProcedure.cs b/src/ReC.Application/Common/Procedures/InsertProcedure/InsertObjectProcedure.cs index ed5d2b7..dd13701 100644 --- a/src/ReC.Application/Common/Procedures/InsertProcedure/InsertObjectProcedure.cs +++ b/src/ReC.Application/Common/Procedures/InsertProcedure/InsertObjectProcedure.cs @@ -37,132 +37,90 @@ public class InsertObjectProcedureHandler(IRepository repo, IOptionsMonitor Handle(InsertObjectProcedure request, CancellationToken cancel) { - var parameters = new[] + var sql = new StringBuilder("EXEC [dbo].[PRREC_INSERT_OBJECT]"); + var parameters = new List(); + var separator = ' '; + + void Add(string name, object? value, System.Data.SqlDbType? dbType = null) { - new SqlParameter("@pENTITY", request.Entity ?? (object)DBNull.Value), + if (value is null) return; + sql.AppendLine($"{separator}@{name} = @{name}"); + separator = ','; + if (dbType.HasValue) + parameters.Add(new SqlParameter($"@{name}", dbType.Value) { Value = value }); + else + parameters.Add(new SqlParameter($"@{name}", value)); + } - new SqlParameter("@pADDED_WHO", (object?)request.AddedWho ?? DBNull.Value), - new SqlParameter("@pADDED_WHEN", (object?)DateTime.UtcNow ?? DBNull.Value), + Add("pENTITY", request.Entity); + Add("pADDED_WHO", request.AddedWho); + Add("pADDED_WHEN", DateTime.UtcNow); - new SqlParameter("@pACTION_PROFILE_ID", (object?)request.Action?.ProfileId ?? DBNull.Value), - new SqlParameter("@pACTION_ACTIVE", (object?)request.Action?.Active ?? DBNull.Value), - new SqlParameter("@pACTION_SEQUENCE", System.Data.SqlDbType.TinyInt) { Value = (object?)request.Action?.Sequence ?? DBNull.Value }, - new SqlParameter("@pACTION_ENDPOINT_ID", (object?)request.Action?.EndpointId ?? DBNull.Value), - new SqlParameter("@pACTION_ENDPOINT_AUTH_ID", (object?)request.Action?.EndpointAuthId ?? DBNull.Value), - new SqlParameter("@pACTION_ENDPOINT_PARAMS_ID", System.Data.SqlDbType.SmallInt) { Value = (object?)request.Action?.EndpointParamsId ?? DBNull.Value }, - new SqlParameter("@pACTION_SQL_CONNECTION_ID", System.Data.SqlDbType.SmallInt) { Value = (object?)request.Action?.SqlConnectionId ?? DBNull.Value }, - new SqlParameter("@pACTION_TYPE_ID", System.Data.SqlDbType.TinyInt) { Value = request.Action?.TypeId is not null ? (object)(byte)request.Action.TypeId : DBNull.Value }, - new SqlParameter("@pACTION_PRE_SQL", (object?)request.Action?.PreSql ?? DBNull.Value), - new SqlParameter("@pACTION_HEADER_SQL", (object?)request.Action?.HeaderSql ?? DBNull.Value), - new SqlParameter("@pACTION_BODY_SQL", (object?)request.Action?.BodySql ?? DBNull.Value), - new SqlParameter("@pACTION_POST_SQL", (object?)request.Action?.PostSql ?? DBNull.Value), - new SqlParameter("@pACTION_ERROR_ACTION_ID", System.Data.SqlDbType.TinyInt) { Value = (object?)request.Action?.ErrorActionId ?? DBNull.Value }, + Add("pACTION_PROFILE_ID", request.Action?.ProfileId); + Add("pACTION_ACTIVE", request.Action?.Active); + Add("pACTION_SEQUENCE", request.Action?.Sequence, System.Data.SqlDbType.TinyInt); + Add("pACTION_ENDPOINT_ID", request.Action?.EndpointId); + Add("pACTION_ENDPOINT_AUTH_ID", request.Action?.EndpointAuthId); + Add("pACTION_ENDPOINT_PARAMS_ID", request.Action?.EndpointParamsId, System.Data.SqlDbType.SmallInt); + Add("pACTION_SQL_CONNECTION_ID", request.Action?.SqlConnectionId, System.Data.SqlDbType.SmallInt); + Add("pACTION_TYPE_ID", request.Action?.TypeId is not null ? (byte)request.Action.TypeId : null, System.Data.SqlDbType.TinyInt); + Add("pACTION_PRE_SQL", request.Action?.PreSql); + Add("pACTION_HEADER_SQL", request.Action?.HeaderSql); + Add("pACTION_BODY_SQL", request.Action?.BodySql); + Add("pACTION_POST_SQL", request.Action?.PostSql); + Add("pACTION_ERROR_ACTION_ID", request.Action?.ErrorActionId, System.Data.SqlDbType.TinyInt); - new SqlParameter("@pENDPOINT_ACTIVE", (object?)request.Endpoint?.Active ?? DBNull.Value), - new SqlParameter("@pENDPOINT_DESCRIPTION", (object?)request.Endpoint?.Description ?? DBNull.Value), - new SqlParameter("@pENDPOINT_URI", (object?)request.Endpoint?.Uri ?? DBNull.Value), + Add("pENDPOINT_ACTIVE", request.Endpoint?.Active); + Add("pENDPOINT_DESCRIPTION", request.Endpoint?.Description); + Add("pENDPOINT_URI", request.Endpoint?.Uri); - new SqlParameter("@pENDPOINT_AUTH_ACTIVE", (object?)request.EndpointAuth?.Active ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_DESCRIPTION", (object?)request.EndpointAuth?.Description ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_TYPE_ID", System.Data.SqlDbType.TinyInt) { Value = (object?)request.EndpointAuth?.TypeId ?? DBNull.Value }, - new SqlParameter("@pENDPOINT_AUTH_API_KEY", (object?)request.EndpointAuth?.ApiKey ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_API_VALUE", (object?)request.EndpointAuth?.ApiValue ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_API_KEY_ADD_TO_ID", (object?)request.EndpointAuth?.ApiKeyAddToId ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_TOKEN", (object?)request.EndpointAuth?.Token ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_USERNAME", (object?)request.EndpointAuth?.Username ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_PASSWORD", (object?)request.EndpointAuth?.Password ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_DOMAIN", (object?)request.EndpointAuth?.Domain ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_WORKSTATION", (object?)request.EndpointAuth?.Workstation ?? DBNull.Value), + Add("pENDPOINT_AUTH_ACTIVE", request.EndpointAuth?.Active); + Add("pENDPOINT_AUTH_DESCRIPTION", request.EndpointAuth?.Description); + Add("pENDPOINT_AUTH_TYPE_ID", request.EndpointAuth?.TypeId, System.Data.SqlDbType.TinyInt); + Add("pENDPOINT_AUTH_API_KEY", request.EndpointAuth?.ApiKey); + Add("pENDPOINT_AUTH_API_VALUE", request.EndpointAuth?.ApiValue); + Add("pENDPOINT_AUTH_API_KEY_ADD_TO_ID", request.EndpointAuth?.ApiKeyAddToId); + Add("pENDPOINT_AUTH_TOKEN", request.EndpointAuth?.Token); + Add("pENDPOINT_AUTH_USERNAME", request.EndpointAuth?.Username); + Add("pENDPOINT_AUTH_PASSWORD", request.EndpointAuth?.Password); + Add("pENDPOINT_AUTH_DOMAIN", request.EndpointAuth?.Domain); + Add("pENDPOINT_AUTH_WORKSTATION", request.EndpointAuth?.Workstation); - new SqlParameter("@pPROFILE_ACTIVE", (object?)request.Profile?.Active ?? DBNull.Value), - new SqlParameter("@pPROFILE_TYPE_ID", System.Data.SqlDbType.TinyInt) { Value = (object?)request.Profile?.TypeId ?? DBNull.Value }, - new SqlParameter("@pPROFILE_MANDANTOR", (object?)request.Profile?.Mandantor ?? DBNull.Value), - new SqlParameter("@pPROFILE_NAME", (object?)request.Profile?.Name ?? DBNull.Value), - new SqlParameter("@pPROFILE_DESCRIPTION", (object?)request.Profile?.Description ?? DBNull.Value), - new SqlParameter("@pPROFILE_LOG_LEVEL_ID", System.Data.SqlDbType.TinyInt) { Value = (object?)request.Profile?.LogLevelId ?? DBNull.Value }, - new SqlParameter("@pPROFILE_LANGUAGE_ID", System.Data.SqlDbType.SmallInt) { Value = (object?)request.Profile?.LanguageId ?? DBNull.Value }, + Add("pPROFILE_ACTIVE", request.Profile?.Active); + Add("pPROFILE_TYPE_ID", request.Profile?.TypeId, System.Data.SqlDbType.TinyInt); + Add("pPROFILE_MANDANTOR", request.Profile?.Mandantor); + Add("pPROFILE_NAME", request.Profile?.Name); + Add("pPROFILE_DESCRIPTION", request.Profile?.Description); + Add("pPROFILE_LOG_LEVEL_ID", request.Profile?.LogLevelId, System.Data.SqlDbType.TinyInt); + Add("pPROFILE_LANGUAGE_ID", request.Profile?.LanguageId, System.Data.SqlDbType.SmallInt); - new SqlParameter("@pRESULT_ACTION_ID", (object?)request.Result?.ActionId ?? DBNull.Value), - new SqlParameter("@pRESULT_STATUS_ID", System.Data.SqlDbType.SmallInt) { Value = (object?)request.Result?.StatusId ?? DBNull.Value }, - new SqlParameter("@pRESULT_HEADER", (object?)request.Result?.Header ?? DBNull.Value), - new SqlParameter("@pRESULT_BODY", (object?)request.Result?.Body ?? DBNull.Value), - new SqlParameter("@pRESULT_INFO", (object?)request.Result?.Info ?? DBNull.Value), - new SqlParameter("@pRESULT_ERROR", (object?)request.Result?.Error ?? DBNull.Value), - new SqlParameter("@pRESULT_TYPE_ID", System.Data.SqlDbType.TinyInt) { Value = request.Result?.Type is not null ? (object)(byte)request.Result.Type : DBNull.Value }, + Add("pRESULT_ACTION_ID", request.Result?.ActionId); + Add("pRESULT_STATUS_ID", request.Result?.StatusId, System.Data.SqlDbType.SmallInt); + Add("pRESULT_TYPE_ID", request.Result?.Type is not null ? (byte)request.Result.Type : null, System.Data.SqlDbType.TinyInt); + Add("pRESULT_HEADER", request.Result?.Header); + Add("pRESULT_BODY", request.Result?.Body); + Add("pRESULT_INFO", request.Result?.Info); + Add("pRESULT_ERROR", request.Result?.Error); - new SqlParameter("@pENDPOINT_PARAMS_ACTIVE", (object?)request.EndpointParams?.Active ?? DBNull.Value), - new SqlParameter("@pENDPOINT_PARAMS_DESCRIPTION", (object?)request.EndpointParams?.Description ?? DBNull.Value), - new SqlParameter("@pENDPOINT_PARAMS_GROUP_ID", System.Data.SqlDbType.SmallInt) { Value = (object?)request.EndpointParams?.GroupId ?? DBNull.Value }, - new SqlParameter("@pENDPOINT_PARAMS_SEQUENCE", System.Data.SqlDbType.TinyInt) { Value = (object?)request.EndpointParams?.Sequence ?? DBNull.Value }, - new SqlParameter("@pENDPOINT_PARAMS_KEY", (object?)request.EndpointParams?.Key ?? DBNull.Value), - new SqlParameter("@pENDPOINT_PARAMS_VALUE", (object?)request.EndpointParams?.Value ?? DBNull.Value), + Add("pENDPOINT_PARAMS_ACTIVE", request.EndpointParams?.Active); + Add("pENDPOINT_PARAMS_DESCRIPTION", request.EndpointParams?.Description); + Add("pENDPOINT_PARAMS_GROUP_ID", request.EndpointParams?.GroupId, System.Data.SqlDbType.SmallInt); + Add("pENDPOINT_PARAMS_SEQUENCE", request.EndpointParams?.Sequence, System.Data.SqlDbType.TinyInt); + Add("pENDPOINT_PARAMS_KEY", request.EndpointParams?.Key); + Add("pENDPOINT_PARAMS_VALUE", request.EndpointParams?.Value); - new SqlParameter - { - ParameterName = "@oGUID", - SqlDbType = System.Data.SqlDbType.BigInt, - Direction = System.Data.ParameterDirection.Output - } - }; - - var sql = new StringBuilder() - .AppendLine("EXEC [dbo].[PRREC_INSERT_OBJECT]") - .AppendLine(" @pENTITY = @pENTITY,") - .AppendLine(" @pADDED_WHO = @pADDED_WHO,") - .AppendLine(" @pADDED_WHEN = @pADDED_WHEN,") - .AppendLine(" @pACTION_PROFILE_ID = @pACTION_PROFILE_ID,") - .AppendLine(" @pACTION_ACTIVE = @pACTION_ACTIVE,") - .AppendLine(" @pACTION_SEQUENCE = @pACTION_SEQUENCE,") - .AppendLine(" @pACTION_ENDPOINT_ID = @pACTION_ENDPOINT_ID,") - .AppendLine(" @pACTION_ENDPOINT_AUTH_ID = @pACTION_ENDPOINT_AUTH_ID,") - .AppendLine(" @pACTION_ENDPOINT_PARAMS_ID = @pACTION_ENDPOINT_PARAMS_ID,") - .AppendLine(" @pACTION_SQL_CONNECTION_ID = @pACTION_SQL_CONNECTION_ID,") - .AppendLine(" @pACTION_TYPE_ID = @pACTION_TYPE_ID,") - .AppendLine(" @pACTION_PRE_SQL = @pACTION_PRE_SQL,") - .AppendLine(" @pACTION_HEADER_SQL = @pACTION_HEADER_SQL,") - .AppendLine(" @pACTION_BODY_SQL = @pACTION_BODY_SQL,") - .AppendLine(" @pACTION_POST_SQL = @pACTION_POST_SQL,") - .AppendLine(" @pACTION_ERROR_ACTION_ID = @pACTION_ERROR_ACTION_ID,") - .AppendLine(" @pENDPOINT_ACTIVE = @pENDPOINT_ACTIVE,") - .AppendLine(" @pENDPOINT_DESCRIPTION = @pENDPOINT_DESCRIPTION,") - .AppendLine(" @pENDPOINT_URI = @pENDPOINT_URI,") - .AppendLine(" @pENDPOINT_AUTH_ACTIVE = @pENDPOINT_AUTH_ACTIVE,") - .AppendLine(" @pENDPOINT_AUTH_DESCRIPTION = @pENDPOINT_AUTH_DESCRIPTION,") - .AppendLine(" @pENDPOINT_AUTH_TYPE_ID = @pENDPOINT_AUTH_TYPE_ID,") - .AppendLine(" @pENDPOINT_AUTH_API_KEY = @pENDPOINT_AUTH_API_KEY,") - .AppendLine(" @pENDPOINT_AUTH_API_VALUE = @pENDPOINT_AUTH_API_VALUE,") - .AppendLine(" @pENDPOINT_AUTH_API_KEY_ADD_TO_ID = @pENDPOINT_AUTH_API_KEY_ADD_TO_ID,") - .AppendLine(" @pENDPOINT_AUTH_TOKEN = @pENDPOINT_AUTH_TOKEN,") - .AppendLine(" @pENDPOINT_AUTH_USERNAME = @pENDPOINT_AUTH_USERNAME,") - .AppendLine(" @pENDPOINT_AUTH_PASSWORD = @pENDPOINT_AUTH_PASSWORD,") - .AppendLine(" @pENDPOINT_AUTH_DOMAIN = @pENDPOINT_AUTH_DOMAIN,") - .AppendLine(" @pENDPOINT_AUTH_WORKSTATION = @pENDPOINT_AUTH_WORKSTATION,") - .AppendLine(" @pPROFILE_ACTIVE = @pPROFILE_ACTIVE,") - .AppendLine(" @pPROFILE_TYPE_ID = @pPROFILE_TYPE_ID,") - .AppendLine(" @pPROFILE_MANDANTOR = @pPROFILE_MANDANTOR,") - .AppendLine(" @pPROFILE_NAME = @pPROFILE_NAME,") - .AppendLine(" @pPROFILE_DESCRIPTION = @pPROFILE_DESCRIPTION,") - .AppendLine(" @pPROFILE_LOG_LEVEL_ID = @pPROFILE_LOG_LEVEL_ID,") - .AppendLine(" @pPROFILE_LANGUAGE_ID = @pPROFILE_LANGUAGE_ID,") - .AppendLine(" @pRESULT_ACTION_ID = @pRESULT_ACTION_ID,") - .AppendLine(" @pRESULT_STATUS_ID = @pRESULT_STATUS_ID,") - .AppendLine(" @pRESULT_HEADER = @pRESULT_HEADER,") - .AppendLine(" @pRESULT_BODY = @pRESULT_BODY,") - .AppendLine(" @pRESULT_INFO = @pRESULT_INFO,") - .AppendLine(" @pRESULT_ERROR = @pRESULT_ERROR,") - .AppendLine(" @pRESULT_TYPE_ID = @pRESULT_TYPE_ID,") - .AppendLine(" @pENDPOINT_PARAMS_ACTIVE = @pENDPOINT_PARAMS_ACTIVE,") - .AppendLine(" @pENDPOINT_PARAMS_DESCRIPTION = @pENDPOINT_PARAMS_DESCRIPTION,") - .AppendLine(" @pENDPOINT_PARAMS_GROUP_ID = @pENDPOINT_PARAMS_GROUP_ID,") - .AppendLine(" @pENDPOINT_PARAMS_SEQUENCE = @pENDPOINT_PARAMS_SEQUENCE,") - .AppendLine(" @pENDPOINT_PARAMS_KEY = @pENDPOINT_PARAMS_KEY,") - .AppendLine(" @pENDPOINT_PARAMS_VALUE = @pENDPOINT_PARAMS_VALUE,") - .AppendLine(" @oGUID = @oGUID OUTPUT") - .ToString(); + // output parameter — always added + sql.AppendLine($"{separator}@oGUID = @oGUID OUTPUT"); + parameters.Add(new SqlParameter + { + ParameterName = "@oGUID", + SqlDbType = System.Data.SqlDbType.BigInt, + Direction = System.Data.ParameterDirection.Output + }); try { - await repo.ExecuteQueryRawAsync(sql, parameters, cancel); + await repo.ExecuteQueryRawAsync(sql.ToString(), parameters.ToArray(), cancel); } catch (SqlException ex) { diff --git a/src/ReC.Application/Common/Procedures/UpdateProcedure/UpdateObjectProcedure.cs b/src/ReC.Application/Common/Procedures/UpdateProcedure/UpdateObjectProcedure.cs index eb6721a..5c05772 100644 --- a/src/ReC.Application/Common/Procedures/UpdateProcedure/UpdateObjectProcedure.cs +++ b/src/ReC.Application/Common/Procedures/UpdateProcedure/UpdateObjectProcedure.cs @@ -37,130 +37,89 @@ public class UpdateObjectProcedureHandler(IRepository repo, IOptionsMonitor Handle(UpdateObjectProcedure request, CancellationToken cancel) { - var parameters = new[] + var execSql = new StringBuilder("EXEC @RC = [dbo].[PRREC_UPDATE_OBJECT]"); + var parameters = new List(); + var separator = ' '; + + void Add(string name, object? value, System.Data.SqlDbType? dbType = null) { - new SqlParameter("@pENTITY", request.Entity ?? (object)DBNull.Value), - new SqlParameter("@pGUID", (object?)request.Id ?? DBNull.Value), + if (value is null) return; + execSql.AppendLine($"{separator}@{name} = @{name}"); + separator = ','; + if (dbType.HasValue) + parameters.Add(new SqlParameter($"@{name}", dbType.Value) { Value = value }); + else + parameters.Add(new SqlParameter($"@{name}", value)); + } - new SqlParameter("@pCHANGED_WHO", (object?)request.ChangedWho ?? DBNull.Value), - new SqlParameter("@pCHANGED_WHEN", (object?)DateTime.UtcNow ?? DBNull.Value), + Add("pENTITY", request.Entity); + Add("pGUID", request.Id); + Add("pCHANGED_WHO", request.ChangedWho); + Add("pCHANGED_WHEN", DateTime.UtcNow); - new SqlParameter("@pACTION_PROFILE_ID", (object?)request.Action.ProfileId ?? DBNull.Value), - new SqlParameter("@pACTION_ACTIVE", (object?)request.Action.Active ?? DBNull.Value), - new SqlParameter("@pACTION_SEQUENCE", System.Data.SqlDbType.TinyInt) { Value = (object?)request.Action.Sequence ?? DBNull.Value }, - new SqlParameter("@pACTION_ENDPOINT_ID", (object?)request.Action.EndpointId ?? DBNull.Value), - new SqlParameter("@pACTION_ENDPOINT_AUTH_ID", (object?)request.Action.EndpointAuthId ?? DBNull.Value), - new SqlParameter("@pACTION_ENDPOINT_PARAMS_ID", System.Data.SqlDbType.SmallInt) { Value = (object?)request.Action.EndpointParamsId ?? DBNull.Value }, - new SqlParameter("@pACTION_SQL_CONNECTION_ID", System.Data.SqlDbType.SmallInt) { Value = (object?)request.Action.SqlConnectionId ?? DBNull.Value }, - new SqlParameter("@pACTION_TYPE_ID", System.Data.SqlDbType.TinyInt) { Value = (object?)request.Action.TypeId ?? DBNull.Value }, - new SqlParameter("@pACTION_PRE_SQL", (object?)request.Action.PreSql ?? DBNull.Value), - new SqlParameter("@pACTION_HEADER_SQL", (object?)request.Action.HeaderSql ?? DBNull.Value), - new SqlParameter("@pACTION_BODY_SQL", (object?)request.Action.BodySql ?? DBNull.Value), - new SqlParameter("@pACTION_POST_SQL", (object?)request.Action.PostSql ?? DBNull.Value), - new SqlParameter("@pACTION_ERROR_ACTION_ID", System.Data.SqlDbType.TinyInt) { Value = (object?)request.Action.ErrorActionId ?? DBNull.Value }, + Add("pACTION_PROFILE_ID", request.Action.ProfileId); + Add("pACTION_ACTIVE", request.Action.Active); + Add("pACTION_SEQUENCE", request.Action.Sequence, System.Data.SqlDbType.TinyInt); + Add("pACTION_ENDPOINT_ID", request.Action.EndpointId); + Add("pACTION_ENDPOINT_AUTH_ID", request.Action.EndpointAuthId); + Add("pACTION_ENDPOINT_PARAMS_ID", request.Action.EndpointParamsId, System.Data.SqlDbType.SmallInt); + Add("pACTION_SQL_CONNECTION_ID", request.Action.SqlConnectionId, System.Data.SqlDbType.SmallInt); + Add("pACTION_TYPE_ID", request.Action.TypeId, System.Data.SqlDbType.TinyInt); + Add("pACTION_PRE_SQL", request.Action.PreSql); + Add("pACTION_HEADER_SQL", request.Action.HeaderSql); + Add("pACTION_BODY_SQL", request.Action.BodySql); + Add("pACTION_POST_SQL", request.Action.PostSql); + Add("pACTION_ERROR_ACTION_ID", request.Action.ErrorActionId, System.Data.SqlDbType.TinyInt); - new SqlParameter("@pENDPOINT_ACTIVE", (object?)request.Endpoint.Active ?? DBNull.Value), - new SqlParameter("@pENDPOINT_DESCRIPTION", (object?)request.Endpoint.Description ?? DBNull.Value), - new SqlParameter("@pENDPOINT_URI", (object?)request.Endpoint.Uri ?? DBNull.Value), + Add("pENDPOINT_ACTIVE", request.Endpoint.Active); + Add("pENDPOINT_DESCRIPTION", request.Endpoint.Description); + Add("pENDPOINT_URI", request.Endpoint.Uri); - new SqlParameter("@pENDPOINT_AUTH_ACTIVE", (object?)request.EndpointAuth.Active ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_DESCRIPTION", (object?)request.EndpointAuth.Description ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_TYPE_ID", System.Data.SqlDbType.TinyInt) { Value = (object?)request.EndpointAuth.TypeId ?? DBNull.Value }, - new SqlParameter("@pENDPOINT_AUTH_API_KEY", (object?)request.EndpointAuth.ApiKey ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_API_VALUE", (object?)request.EndpointAuth.ApiValue ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_API_KEY_ADD_TO_ID", (object?)request.EndpointAuth.ApiKeyAddToId ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_TOKEN", (object?)request.EndpointAuth.Token ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_USERNAME", (object?)request.EndpointAuth.Username ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_PASSWORD", (object?)request.EndpointAuth.Password ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_DOMAIN", (object?)request.EndpointAuth.Domain ?? DBNull.Value), - new SqlParameter("@pENDPOINT_AUTH_WORKSTATION", (object?)request.EndpointAuth.Workstation ?? DBNull.Value), + Add("pENDPOINT_AUTH_ACTIVE", request.EndpointAuth.Active); + Add("pENDPOINT_AUTH_DESCRIPTION", request.EndpointAuth.Description); + Add("pENDPOINT_AUTH_TYPE_ID", request.EndpointAuth.TypeId, System.Data.SqlDbType.TinyInt); + Add("pENDPOINT_AUTH_API_KEY", request.EndpointAuth.ApiKey); + Add("pENDPOINT_AUTH_API_VALUE", request.EndpointAuth.ApiValue); + Add("pENDPOINT_AUTH_API_KEY_ADD_TO_ID", request.EndpointAuth.ApiKeyAddToId); + Add("pENDPOINT_AUTH_TOKEN", request.EndpointAuth.Token); + Add("pENDPOINT_AUTH_USERNAME", request.EndpointAuth.Username); + Add("pENDPOINT_AUTH_PASSWORD", request.EndpointAuth.Password); + Add("pENDPOINT_AUTH_DOMAIN", request.EndpointAuth.Domain); + Add("pENDPOINT_AUTH_WORKSTATION", request.EndpointAuth.Workstation); - new SqlParameter("@pENDPOINT_PARAMS_ACTIVE", (object?)request.EndpointParams.Active ?? DBNull.Value), - new SqlParameter("@pENDPOINT_PARAMS_DESCRIPTION", (object?)request.EndpointParams.Description ?? DBNull.Value), - new SqlParameter("@pENDPOINT_PARAMS_GROUP_ID", System.Data.SqlDbType.SmallInt) { Value = (object?)request.EndpointParams.GroupId ?? DBNull.Value }, - new SqlParameter("@pENDPOINT_PARAMS_SEQUENCE", System.Data.SqlDbType.TinyInt) { Value = (object?)request.EndpointParams.Sequence ?? DBNull.Value }, - new SqlParameter("@pENDPOINT_PARAMS_KEY", (object?)request.EndpointParams.Key ?? DBNull.Value), - new SqlParameter("@pENDPOINT_PARAMS_VALUE", (object?)request.EndpointParams.Value ?? DBNull.Value), + Add("pENDPOINT_PARAMS_ACTIVE", request.EndpointParams.Active); + Add("pENDPOINT_PARAMS_DESCRIPTION", request.EndpointParams.Description); + Add("pENDPOINT_PARAMS_GROUP_ID", request.EndpointParams.GroupId, System.Data.SqlDbType.SmallInt); + Add("pENDPOINT_PARAMS_SEQUENCE", request.EndpointParams.Sequence, System.Data.SqlDbType.TinyInt); + Add("pENDPOINT_PARAMS_KEY", request.EndpointParams.Key); + Add("pENDPOINT_PARAMS_VALUE", request.EndpointParams.Value); - new SqlParameter("@pPROFILE_ACTIVE", (object?)request.Profile.Active ?? DBNull.Value), - new SqlParameter("@pPROFILE_TYPE_ID", System.Data.SqlDbType.TinyInt) { Value = (object?)request.Profile.TypeId ?? DBNull.Value }, - new SqlParameter("@pPROFILE_MANDANTOR", (object?)request.Profile.Mandantor ?? DBNull.Value), - new SqlParameter("@pPROFILE_NAME", (object?)request.Profile.Name ?? DBNull.Value), - new SqlParameter("@pPROFILE_DESCRIPTION", (object?)request.Profile.Description ?? DBNull.Value), - new SqlParameter("@pPROFILE_LOG_LEVEL_ID", System.Data.SqlDbType.TinyInt) { Value = (object?)request.Profile.LogLevelId ?? DBNull.Value }, - new SqlParameter("@pPROFILE_LANGUAGE_ID", System.Data.SqlDbType.SmallInt) { Value = (object?)request.Profile.LanguageId ?? DBNull.Value }, - new SqlParameter("@pPROFILE_FIRST_RUN", (object?)request.Profile.FirstRun ?? DBNull.Value), - new SqlParameter("@pPROFILE_LAST_RUN", (object?)request.Profile.LastRun ?? DBNull.Value), - new SqlParameter("@pPROFILE_LAST_RESULT", (object?)request.Profile.LastResult ?? DBNull.Value), + Add("pPROFILE_ACTIVE", request.Profile.Active); + Add("pPROFILE_TYPE_ID", request.Profile.TypeId, System.Data.SqlDbType.TinyInt); + Add("pPROFILE_MANDANTOR", request.Profile.Mandantor); + Add("pPROFILE_NAME", request.Profile.Name); + Add("pPROFILE_DESCRIPTION", request.Profile.Description); + Add("pPROFILE_LOG_LEVEL_ID", request.Profile.LogLevelId, System.Data.SqlDbType.TinyInt); + Add("pPROFILE_LANGUAGE_ID", request.Profile.LanguageId, System.Data.SqlDbType.SmallInt); + Add("pPROFILE_FIRST_RUN", request.Profile.FirstRun); + Add("pPROFILE_LAST_RUN", request.Profile.LastRun); + Add("pPROFILE_LAST_RESULT", request.Profile.LastResult); - new SqlParameter("@pRESULT_ACTION_ID", (object?)request.Result.ActionId ?? DBNull.Value), - new SqlParameter("@pRESULT_STATUS_ID", System.Data.SqlDbType.SmallInt) { Value = (object?)request.Result.StatusId ?? DBNull.Value }, - new SqlParameter("@pRESULT_HEADER", (object?)request.Result.Header ?? DBNull.Value), - new SqlParameter("@pRESULT_BODY", (object?)request.Result.Body ?? DBNull.Value) - }; + Add("pRESULT_ACTION_ID", request.Result.ActionId); + Add("pRESULT_STATUS_ID", request.Result.StatusId, System.Data.SqlDbType.SmallInt); + Add("pRESULT_HEADER", request.Result.Header); + Add("pRESULT_BODY", request.Result.Body); + + var sql = new StringBuilder() + .AppendLine("DECLARE @RC SMALLINT = 0;") + .Append(execSql).AppendLine(";") + .AppendLine("SELECT @RC;") + .ToString(); try { - var sql = new StringBuilder() - .AppendLine("DECLARE @RC SMALLINT = 0;") - .AppendLine("EXEC @RC = [dbo].[PRREC_UPDATE_OBJECT]") - .AppendLine(" @pENTITY = @pENTITY,") - .AppendLine(" @pGUID = @pGUID,") - .AppendLine(" @pCHANGED_WHO = @pCHANGED_WHO,") - .AppendLine(" @pCHANGED_WHEN = @pCHANGED_WHEN,") - .AppendLine(" @pACTION_PROFILE_ID = @pACTION_PROFILE_ID,") - .AppendLine(" @pACTION_ACTIVE = @pACTION_ACTIVE,") - .AppendLine(" @pACTION_SEQUENCE = @pACTION_SEQUENCE,") - .AppendLine(" @pACTION_ENDPOINT_ID = @pACTION_ENDPOINT_ID,") - .AppendLine(" @pACTION_ENDPOINT_AUTH_ID = @pACTION_ENDPOINT_AUTH_ID,") - .AppendLine(" @pACTION_ENDPOINT_PARAMS_ID = @pACTION_ENDPOINT_PARAMS_ID,") - .AppendLine(" @pACTION_SQL_CONNECTION_ID = @pACTION_SQL_CONNECTION_ID,") - .AppendLine(" @pACTION_TYPE_ID = @pACTION_TYPE_ID,") - .AppendLine(" @pACTION_PRE_SQL = @pACTION_PRE_SQL,") - .AppendLine(" @pACTION_HEADER_SQL = @pACTION_HEADER_SQL,") - .AppendLine(" @pACTION_BODY_SQL = @pACTION_BODY_SQL,") - .AppendLine(" @pACTION_POST_SQL = @pACTION_POST_SQL,") - .AppendLine(" @pACTION_ERROR_ACTION_ID = @pACTION_ERROR_ACTION_ID,") - .AppendLine(" @pENDPOINT_ACTIVE = @pENDPOINT_ACTIVE,") - .AppendLine(" @pENDPOINT_DESCRIPTION = @pENDPOINT_DESCRIPTION,") - .AppendLine(" @pENDPOINT_URI = @pENDPOINT_URI,") - .AppendLine(" @pENDPOINT_AUTH_ACTIVE = @pENDPOINT_AUTH_ACTIVE,") - .AppendLine(" @pENDPOINT_AUTH_DESCRIPTION = @pENDPOINT_AUTH_DESCRIPTION,") - .AppendLine(" @pENDPOINT_AUTH_TYPE_ID = @pENDPOINT_AUTH_TYPE_ID,") - .AppendLine(" @pENDPOINT_AUTH_API_KEY = @pENDPOINT_AUTH_API_KEY,") - .AppendLine(" @pENDPOINT_AUTH_API_VALUE = @pENDPOINT_AUTH_API_VALUE,") - .AppendLine(" @pENDPOINT_AUTH_API_KEY_ADD_TO_ID = @pENDPOINT_AUTH_API_KEY_ADD_TO_ID,") - .AppendLine(" @pENDPOINT_AUTH_TOKEN = @pENDPOINT_AUTH_TOKEN,") - .AppendLine(" @pENDPOINT_AUTH_USERNAME = @pENDPOINT_AUTH_USERNAME,") - .AppendLine(" @pENDPOINT_AUTH_PASSWORD = @pENDPOINT_AUTH_PASSWORD,") - .AppendLine(" @pENDPOINT_AUTH_DOMAIN = @pENDPOINT_AUTH_DOMAIN,") - .AppendLine(" @pENDPOINT_AUTH_WORKSTATION = @pENDPOINT_AUTH_WORKSTATION,") - .AppendLine(" @pENDPOINT_PARAMS_ACTIVE = @pENDPOINT_PARAMS_ACTIVE,") - .AppendLine(" @pENDPOINT_PARAMS_DESCRIPTION = @pENDPOINT_PARAMS_DESCRIPTION,") - .AppendLine(" @pENDPOINT_PARAMS_GROUP_ID = @pENDPOINT_PARAMS_GROUP_ID,") - .AppendLine(" @pENDPOINT_PARAMS_SEQUENCE = @pENDPOINT_PARAMS_SEQUENCE,") - .AppendLine(" @pENDPOINT_PARAMS_KEY = @pENDPOINT_PARAMS_KEY,") - .AppendLine(" @pENDPOINT_PARAMS_VALUE = @pENDPOINT_PARAMS_VALUE,") - .AppendLine(" @pPROFILE_ACTIVE = @pPROFILE_ACTIVE,") - .AppendLine(" @pPROFILE_TYPE_ID = @pPROFILE_TYPE_ID,") - .AppendLine(" @pPROFILE_MANDANTOR = @pPROFILE_MANDANTOR,") - .AppendLine(" @pPROFILE_NAME = @pPROFILE_NAME,") - .AppendLine(" @pPROFILE_DESCRIPTION = @pPROFILE_DESCRIPTION,") - .AppendLine(" @pPROFILE_LOG_LEVEL_ID = @pPROFILE_LOG_LEVEL_ID,") - .AppendLine(" @pPROFILE_LANGUAGE_ID = @pPROFILE_LANGUAGE_ID,") - .AppendLine(" @pPROFILE_FIRST_RUN = @pPROFILE_FIRST_RUN,") - .AppendLine(" @pPROFILE_LAST_RUN = @pPROFILE_LAST_RUN,") - .AppendLine(" @pPROFILE_LAST_RESULT = @pPROFILE_LAST_RESULT,") - .AppendLine(" @pRESULT_ACTION_ID = @pRESULT_ACTION_ID,") - .AppendLine(" @pRESULT_STATUS_ID = @pRESULT_STATUS_ID,") - .AppendLine(" @pRESULT_HEADER = @pRESULT_HEADER,") - .AppendLine(" @pRESULT_BODY = @pRESULT_BODY;") - .AppendLine("SELECT @RC;") - .ToString(); + var result = await repo.ExecuteQueryRawAsync(sql, parameters.ToArray(), cancel); - var result = await repo.ExecuteQueryRawAsync(sql, parameters, cancel); - - // The stored procedure returns 0 on success, error codes > 0 on failure if (result > 0) { throw new UpdateObjectFailedException(request, $"UpdateObject stored procedure failed with error code: {result}");