Refactor: add StoredProcedureBuilder for SQL calls

Introduce StoredProcedureBuilder to centralize and simplify the construction of SQL stored procedure calls and parameter lists. Refactor DeleteObjectProcedureHandler, InsertObjectProcedureHandler, and UpdateObjectProcedureHandler to use this utility, replacing manual StringBuilder and parameter management. Improves code readability, reduces duplication, and standardizes parameter handling, including output parameters.
This commit is contained in:
2026-03-27 15:11:16 +01:00
parent 70dc52139d
commit b66a49f74d
4 changed files with 174 additions and 178 deletions

View File

@@ -36,32 +36,21 @@ public class DeleteObjectProcedureHandler(IRepository repo, IOptionsMonitor<SqlE
{ {
public async Task<int> Handle(DeleteObjectProcedure request, CancellationToken cancel) public async Task<int> Handle(DeleteObjectProcedure request, CancellationToken cancel)
{ {
var execSql = new StringBuilder("EXEC @RC = [dbo].[PRREC_DELETE_OBJECT]"); var sp = new StoredProcedureBuilder("EXEC @RC = [dbo].[PRREC_DELETE_OBJECT]")
var parameters = new List<SqlParameter>(); .Add("pENTITY", request.Entity)
var separator = ' '; .Add("pSTART", request.Start.ToString())
.Add("pEND", request.End.ToString())
void Add(string name, object? value) .Add("pFORCE", request.Force);
{
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() var sql = new StringBuilder()
.AppendLine("DECLARE @RC SMALLINT = 0;") .AppendLine("DECLARE @RC SMALLINT = 0;")
.Append(execSql).AppendLine(";") .Append(sp.BuildSql()).AppendLine(";")
.AppendLine("SELECT @RC;") .AppendLine("SELECT @RC;")
.ToString(); .ToString();
try try
{ {
var result = await repo.ExecuteQueryRawAsync(sql, parameters.ToArray(), cancel); var result = await repo.ExecuteQueryRawAsync(sql, sp.BuildParameters(), cancel);
if (result > 0) if (result > 0)
{ {

View File

@@ -11,7 +11,7 @@ using ReC.Application.Endpoints.Commands;
using ReC.Application.Profile.Commands; using ReC.Application.Profile.Commands;
using ReC.Application.RecActions.Commands; using ReC.Application.RecActions.Commands;
using ReC.Application.Results.Commands; using ReC.Application.Results.Commands;
using System.Text; using System.Data;
namespace ReC.Application.Common.Procedures.InsertProcedure; namespace ReC.Application.Common.Procedures.InsertProcedure;
@@ -37,90 +37,62 @@ public class InsertObjectProcedureHandler(IRepository repo, IOptionsMonitor<SqlE
{ {
public async Task<long> Handle(InsertObjectProcedure request, CancellationToken cancel) public async Task<long> Handle(InsertObjectProcedure request, CancellationToken cancel)
{ {
var sql = new StringBuilder("EXEC [dbo].[PRREC_INSERT_OBJECT]"); var sp = new StoredProcedureBuilder("EXEC [dbo].[PRREC_INSERT_OBJECT]")
var parameters = new List<SqlParameter>(); .Add("pENTITY", request.Entity)
var separator = ' '; .Add("pADDED_WHO", request.AddedWho)
.Add("pADDED_WHEN", DateTime.UtcNow)
void Add(string name, object? value, System.Data.SqlDbType? dbType = null) .Add("pACTION_PROFILE_ID", request.Action?.ProfileId)
{ .Add("pACTION_ACTIVE", request.Action?.Active)
if (value is null) return; .Add("pACTION_SEQUENCE", request.Action?.Sequence, SqlDbType.TinyInt)
sql.AppendLine($"{separator}@{name} = @{name}"); .Add("pACTION_ENDPOINT_ID", request.Action?.EndpointId)
separator = ','; .Add("pACTION_ENDPOINT_AUTH_ID", request.Action?.EndpointAuthId)
if (dbType.HasValue) .Add("pACTION_ENDPOINT_PARAMS_ID", request.Action?.EndpointParamsId, SqlDbType.SmallInt)
parameters.Add(new SqlParameter($"@{name}", dbType.Value) { Value = value }); .Add("pACTION_SQL_CONNECTION_ID", request.Action?.SqlConnectionId, SqlDbType.SmallInt)
else .Add("pACTION_TYPE_ID", request.Action?.TypeId is not null ? (byte)request.Action.TypeId : null, SqlDbType.TinyInt)
parameters.Add(new SqlParameter($"@{name}", value)); .Add("pACTION_PRE_SQL", request.Action?.PreSql)
} .Add("pACTION_HEADER_SQL", request.Action?.HeaderSql)
.Add("pACTION_BODY_SQL", request.Action?.BodySql)
Add("pENTITY", request.Entity); .Add("pACTION_POST_SQL", request.Action?.PostSql)
Add("pADDED_WHO", request.AddedWho); .Add("pACTION_ERROR_ACTION_ID", request.Action?.ErrorActionId, SqlDbType.TinyInt)
Add("pADDED_WHEN", DateTime.UtcNow); .Add("pENDPOINT_ACTIVE", request.Endpoint?.Active)
.Add("pENDPOINT_DESCRIPTION", request.Endpoint?.Description)
Add("pACTION_PROFILE_ID", request.Action?.ProfileId); .Add("pENDPOINT_URI", request.Endpoint?.Uri)
Add("pACTION_ACTIVE", request.Action?.Active); .Add("pENDPOINT_AUTH_ACTIVE", request.EndpointAuth?.Active)
Add("pACTION_SEQUENCE", request.Action?.Sequence, System.Data.SqlDbType.TinyInt); .Add("pENDPOINT_AUTH_DESCRIPTION", request.EndpointAuth?.Description)
Add("pACTION_ENDPOINT_ID", request.Action?.EndpointId); .Add("pENDPOINT_AUTH_TYPE_ID", request.EndpointAuth?.TypeId, SqlDbType.TinyInt)
Add("pACTION_ENDPOINT_AUTH_ID", request.Action?.EndpointAuthId); .Add("pENDPOINT_AUTH_API_KEY", request.EndpointAuth?.ApiKey)
Add("pACTION_ENDPOINT_PARAMS_ID", request.Action?.EndpointParamsId, System.Data.SqlDbType.SmallInt); .Add("pENDPOINT_AUTH_API_VALUE", request.EndpointAuth?.ApiValue)
Add("pACTION_SQL_CONNECTION_ID", request.Action?.SqlConnectionId, System.Data.SqlDbType.SmallInt); .Add("pENDPOINT_AUTH_API_KEY_ADD_TO_ID", request.EndpointAuth?.ApiKeyAddToId)
Add("pACTION_TYPE_ID", request.Action?.TypeId is not null ? (byte)request.Action.TypeId : null, System.Data.SqlDbType.TinyInt); .Add("pENDPOINT_AUTH_TOKEN", request.EndpointAuth?.Token)
Add("pACTION_PRE_SQL", request.Action?.PreSql); .Add("pENDPOINT_AUTH_USERNAME", request.EndpointAuth?.Username)
Add("pACTION_HEADER_SQL", request.Action?.HeaderSql); .Add("pENDPOINT_AUTH_PASSWORD", request.EndpointAuth?.Password)
Add("pACTION_BODY_SQL", request.Action?.BodySql); .Add("pENDPOINT_AUTH_DOMAIN", request.EndpointAuth?.Domain)
Add("pACTION_POST_SQL", request.Action?.PostSql); .Add("pENDPOINT_AUTH_WORKSTATION", request.EndpointAuth?.Workstation)
Add("pACTION_ERROR_ACTION_ID", request.Action?.ErrorActionId, System.Data.SqlDbType.TinyInt); .Add("pPROFILE_ACTIVE", request.Profile?.Active)
.Add("pPROFILE_TYPE_ID", request.Profile?.TypeId, SqlDbType.TinyInt)
Add("pENDPOINT_ACTIVE", request.Endpoint?.Active); .Add("pPROFILE_MANDANTOR", request.Profile?.Mandantor)
Add("pENDPOINT_DESCRIPTION", request.Endpoint?.Description); .Add("pPROFILE_NAME", request.Profile?.Name)
Add("pENDPOINT_URI", request.Endpoint?.Uri); .Add("pPROFILE_DESCRIPTION", request.Profile?.Description)
.Add("pPROFILE_LOG_LEVEL_ID", request.Profile?.LogLevelId, SqlDbType.TinyInt)
Add("pENDPOINT_AUTH_ACTIVE", request.EndpointAuth?.Active); .Add("pPROFILE_LANGUAGE_ID", request.Profile?.LanguageId, SqlDbType.SmallInt)
Add("pENDPOINT_AUTH_DESCRIPTION", request.EndpointAuth?.Description); .Add("pRESULT_ACTION_ID", request.Result?.ActionId)
Add("pENDPOINT_AUTH_TYPE_ID", request.EndpointAuth?.TypeId, System.Data.SqlDbType.TinyInt); .Add("pRESULT_STATUS_ID", request.Result?.StatusId, SqlDbType.SmallInt)
Add("pENDPOINT_AUTH_API_KEY", request.EndpointAuth?.ApiKey); .Add("pRESULT_TYPE_ID", request.Result?.Type is not null ? (byte)request.Result.Type : null, SqlDbType.TinyInt)
Add("pENDPOINT_AUTH_API_VALUE", request.EndpointAuth?.ApiValue); .Add("pRESULT_HEADER", request.Result?.Header)
Add("pENDPOINT_AUTH_API_KEY_ADD_TO_ID", request.EndpointAuth?.ApiKeyAddToId); .Add("pRESULT_BODY", request.Result?.Body)
Add("pENDPOINT_AUTH_TOKEN", request.EndpointAuth?.Token); .Add("pRESULT_INFO", request.Result?.Info)
Add("pENDPOINT_AUTH_USERNAME", request.EndpointAuth?.Username); .Add("pRESULT_ERROR", request.Result?.Error)
Add("pENDPOINT_AUTH_PASSWORD", request.EndpointAuth?.Password); .Add("pENDPOINT_PARAMS_ACTIVE", request.EndpointParams?.Active)
Add("pENDPOINT_AUTH_DOMAIN", request.EndpointAuth?.Domain); .Add("pENDPOINT_PARAMS_DESCRIPTION", request.EndpointParams?.Description)
Add("pENDPOINT_AUTH_WORKSTATION", request.EndpointAuth?.Workstation); .Add("pENDPOINT_PARAMS_GROUP_ID", request.EndpointParams?.GroupId, SqlDbType.SmallInt)
.Add("pENDPOINT_PARAMS_SEQUENCE", request.EndpointParams?.Sequence, SqlDbType.TinyInt)
Add("pPROFILE_ACTIVE", request.Profile?.Active); .Add("pENDPOINT_PARAMS_KEY", request.EndpointParams?.Key)
Add("pPROFILE_TYPE_ID", request.Profile?.TypeId, System.Data.SqlDbType.TinyInt); .Add("pENDPOINT_PARAMS_VALUE", request.EndpointParams?.Value)
Add("pPROFILE_MANDANTOR", request.Profile?.Mandantor); .AddOutput("oGUID", SqlDbType.BigInt);
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("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);
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);
// 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 try
{ {
await repo.ExecuteQueryRawAsync(sql.ToString(), parameters.ToArray(), cancel); await repo.ExecuteQueryRawAsync(sp.BuildSql(), sp.BuildParameters(), cancel);
} }
catch (SqlException ex) catch (SqlException ex)
{ {
@@ -130,12 +102,12 @@ public class InsertObjectProcedureHandler(IRepository repo, IOptionsMonitor<SqlE
throw; throw;
} }
var guidParam = parameters.Last(); var guidParam = sp.GetParameter("oGUID");
if (guidParam.Value != DBNull.Value) if (guidParam?.Value != DBNull.Value)
if (guidParam.Value is long longValue) if (guidParam!.Value is long longValue)
return longValue; return longValue;
else if (long.TryParse(guidParam.Value.ToString(), out var guid)) else if (long.TryParse(guidParam.Value?.ToString(), out var guid))
return guid; return guid;
throw new InsertObjectFailedException(request, "InsertObject stored procedure did not return a valid identifier."); throw new InsertObjectFailedException(request, "InsertObject stored procedure did not return a valid identifier.");

View File

@@ -0,0 +1,54 @@
using Microsoft.Data.SqlClient;
using System.Data;
using System.Text;
namespace ReC.Application.Common.Procedures;
internal sealed class StoredProcedureBuilder
{
private readonly StringBuilder _sql;
private readonly List<SqlParameter> _parameters = [];
private char _separator = ' ';
public StoredProcedureBuilder(string execPrefix)
{
_sql = new StringBuilder(execPrefix);
}
public StoredProcedureBuilder Add(string name, object? value, SqlDbType? dbType = null)
{
if (value is null) return this;
_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));
return this;
}
public StoredProcedureBuilder AddOutput(string name, SqlDbType dbType)
{
_sql.AppendLine($"{_separator}@{name} = @{name} OUTPUT");
_separator = ',';
_parameters.Add(new SqlParameter
{
ParameterName = $"@{name}",
SqlDbType = dbType,
Direction = ParameterDirection.Output
});
return this;
}
public string BuildSql() => _sql.ToString();
public SqlParameter[] BuildParameters() => [.. _parameters];
public SqlParameter? GetParameter(string name) =>
_parameters.Find(p => p.ParameterName == $"@{name}");
}

View File

@@ -6,6 +6,7 @@ using Microsoft.Extensions.Options;
using ReC.Application.Common.Exceptions; using ReC.Application.Common.Exceptions;
using ReC.Application.Common.Options; using ReC.Application.Common.Options;
using ReC.Application.Common.Procedures.UpdateProcedure.Dto; using ReC.Application.Common.Procedures.UpdateProcedure.Dto;
using System.Data;
using System.Text; using System.Text;
namespace ReC.Application.Common.Procedures.UpdateProcedure; namespace ReC.Application.Common.Procedures.UpdateProcedure;
@@ -37,88 +38,68 @@ public class UpdateObjectProcedureHandler(IRepository repo, IOptionsMonitor<SqlE
{ {
public async Task<int> Handle(UpdateObjectProcedure request, CancellationToken cancel) public async Task<int> Handle(UpdateObjectProcedure request, CancellationToken cancel)
{ {
var execSql = new StringBuilder("EXEC @RC = [dbo].[PRREC_UPDATE_OBJECT]"); var sp = new StoredProcedureBuilder("EXEC @RC = [dbo].[PRREC_UPDATE_OBJECT]")
var parameters = new List<SqlParameter>(); .Add("pENTITY", request.Entity)
var separator = ' '; .Add("pGUID", request.Id)
.Add("pCHANGED_WHO", request.ChangedWho)
void Add(string name, object? value, System.Data.SqlDbType? dbType = null) .Add("pCHANGED_WHEN", DateTime.UtcNow)
{ .Add("pACTION_PROFILE_ID", request.Action.ProfileId)
if (value is null) return; .Add("pACTION_ACTIVE", request.Action.Active)
execSql.AppendLine($"{separator}@{name} = @{name}"); .Add("pACTION_SEQUENCE", request.Action.Sequence, SqlDbType.TinyInt)
separator = ','; .Add("pACTION_ENDPOINT_ID", request.Action.EndpointId)
if (dbType.HasValue) .Add("pACTION_ENDPOINT_AUTH_ID", request.Action.EndpointAuthId)
parameters.Add(new SqlParameter($"@{name}", dbType.Value) { Value = value }); .Add("pACTION_ENDPOINT_PARAMS_ID", request.Action.EndpointParamsId, SqlDbType.SmallInt)
else .Add("pACTION_SQL_CONNECTION_ID", request.Action.SqlConnectionId, SqlDbType.SmallInt)
parameters.Add(new SqlParameter($"@{name}", value)); .Add("pACTION_TYPE_ID", request.Action.TypeId, SqlDbType.TinyInt)
} .Add("pACTION_PRE_SQL", request.Action.PreSql)
.Add("pACTION_HEADER_SQL", request.Action.HeaderSql)
Add("pENTITY", request.Entity); .Add("pACTION_BODY_SQL", request.Action.BodySql)
Add("pGUID", request.Id); .Add("pACTION_POST_SQL", request.Action.PostSql)
Add("pCHANGED_WHO", request.ChangedWho); .Add("pACTION_ERROR_ACTION_ID", request.Action.ErrorActionId, SqlDbType.TinyInt)
Add("pCHANGED_WHEN", DateTime.UtcNow); .Add("pENDPOINT_ACTIVE", request.Endpoint.Active)
.Add("pENDPOINT_DESCRIPTION", request.Endpoint.Description)
Add("pACTION_PROFILE_ID", request.Action.ProfileId); .Add("pENDPOINT_URI", request.Endpoint.Uri)
Add("pACTION_ACTIVE", request.Action.Active); .Add("pENDPOINT_AUTH_ACTIVE", request.EndpointAuth.Active)
Add("pACTION_SEQUENCE", request.Action.Sequence, System.Data.SqlDbType.TinyInt); .Add("pENDPOINT_AUTH_DESCRIPTION", request.EndpointAuth.Description)
Add("pACTION_ENDPOINT_ID", request.Action.EndpointId); .Add("pENDPOINT_AUTH_TYPE_ID", request.EndpointAuth.TypeId, SqlDbType.TinyInt)
Add("pACTION_ENDPOINT_AUTH_ID", request.Action.EndpointAuthId); .Add("pENDPOINT_AUTH_API_KEY", request.EndpointAuth.ApiKey)
Add("pACTION_ENDPOINT_PARAMS_ID", request.Action.EndpointParamsId, System.Data.SqlDbType.SmallInt); .Add("pENDPOINT_AUTH_API_VALUE", request.EndpointAuth.ApiValue)
Add("pACTION_SQL_CONNECTION_ID", request.Action.SqlConnectionId, System.Data.SqlDbType.SmallInt); .Add("pENDPOINT_AUTH_API_KEY_ADD_TO_ID", request.EndpointAuth.ApiKeyAddToId)
Add("pACTION_TYPE_ID", request.Action.TypeId, System.Data.SqlDbType.TinyInt); .Add("pENDPOINT_AUTH_TOKEN", request.EndpointAuth.Token)
Add("pACTION_PRE_SQL", request.Action.PreSql); .Add("pENDPOINT_AUTH_USERNAME", request.EndpointAuth.Username)
Add("pACTION_HEADER_SQL", request.Action.HeaderSql); .Add("pENDPOINT_AUTH_PASSWORD", request.EndpointAuth.Password)
Add("pACTION_BODY_SQL", request.Action.BodySql); .Add("pENDPOINT_AUTH_DOMAIN", request.EndpointAuth.Domain)
Add("pACTION_POST_SQL", request.Action.PostSql); .Add("pENDPOINT_AUTH_WORKSTATION", request.EndpointAuth.Workstation)
Add("pACTION_ERROR_ACTION_ID", request.Action.ErrorActionId, System.Data.SqlDbType.TinyInt); .Add("pENDPOINT_PARAMS_ACTIVE", request.EndpointParams.Active)
.Add("pENDPOINT_PARAMS_DESCRIPTION", request.EndpointParams.Description)
Add("pENDPOINT_ACTIVE", request.Endpoint.Active); .Add("pENDPOINT_PARAMS_GROUP_ID", request.EndpointParams.GroupId, SqlDbType.SmallInt)
Add("pENDPOINT_DESCRIPTION", request.Endpoint.Description); .Add("pENDPOINT_PARAMS_SEQUENCE", request.EndpointParams.Sequence, SqlDbType.TinyInt)
Add("pENDPOINT_URI", request.Endpoint.Uri); .Add("pENDPOINT_PARAMS_KEY", request.EndpointParams.Key)
.Add("pENDPOINT_PARAMS_VALUE", request.EndpointParams.Value)
Add("pENDPOINT_AUTH_ACTIVE", request.EndpointAuth.Active); .Add("pPROFILE_ACTIVE", request.Profile.Active)
Add("pENDPOINT_AUTH_DESCRIPTION", request.EndpointAuth.Description); .Add("pPROFILE_TYPE_ID", request.Profile.TypeId, SqlDbType.TinyInt)
Add("pENDPOINT_AUTH_TYPE_ID", request.EndpointAuth.TypeId, System.Data.SqlDbType.TinyInt); .Add("pPROFILE_MANDANTOR", request.Profile.Mandantor)
Add("pENDPOINT_AUTH_API_KEY", request.EndpointAuth.ApiKey); .Add("pPROFILE_NAME", request.Profile.Name)
Add("pENDPOINT_AUTH_API_VALUE", request.EndpointAuth.ApiValue); .Add("pPROFILE_DESCRIPTION", request.Profile.Description)
Add("pENDPOINT_AUTH_API_KEY_ADD_TO_ID", request.EndpointAuth.ApiKeyAddToId); .Add("pPROFILE_LOG_LEVEL_ID", request.Profile.LogLevelId, SqlDbType.TinyInt)
Add("pENDPOINT_AUTH_TOKEN", request.EndpointAuth.Token); .Add("pPROFILE_LANGUAGE_ID", request.Profile.LanguageId, SqlDbType.SmallInt)
Add("pENDPOINT_AUTH_USERNAME", request.EndpointAuth.Username); .Add("pPROFILE_FIRST_RUN", request.Profile.FirstRun)
Add("pENDPOINT_AUTH_PASSWORD", request.EndpointAuth.Password); .Add("pPROFILE_LAST_RUN", request.Profile.LastRun)
Add("pENDPOINT_AUTH_DOMAIN", request.EndpointAuth.Domain); .Add("pPROFILE_LAST_RESULT", request.Profile.LastResult)
Add("pENDPOINT_AUTH_WORKSTATION", request.EndpointAuth.Workstation); .Add("pRESULT_ACTION_ID", request.Result.ActionId)
.Add("pRESULT_STATUS_ID", request.Result.StatusId, SqlDbType.SmallInt)
Add("pENDPOINT_PARAMS_ACTIVE", request.EndpointParams.Active); .Add("pRESULT_HEADER", request.Result.Header)
Add("pENDPOINT_PARAMS_DESCRIPTION", request.EndpointParams.Description); .Add("pRESULT_BODY", request.Result.Body);
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);
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);
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() var sql = new StringBuilder()
.AppendLine("DECLARE @RC SMALLINT = 0;") .AppendLine("DECLARE @RC SMALLINT = 0;")
.Append(execSql).AppendLine(";") .Append(sp.BuildSql()).AppendLine(";")
.AppendLine("SELECT @RC;") .AppendLine("SELECT @RC;")
.ToString(); .ToString();
try try
{ {
var result = await repo.ExecuteQueryRawAsync(sql, parameters.ToArray(), cancel); var result = await repo.ExecuteQueryRawAsync(sql, sp.BuildParameters(), cancel);
if (result > 0) if (result > 0)
{ {