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.
This commit is contained in:
@@ -37,130 +37,89 @@ public class UpdateObjectProcedureHandler(IRepository repo, IOptionsMonitor<SqlE
|
||||
{
|
||||
public async Task<int> Handle(UpdateObjectProcedure request, CancellationToken cancel)
|
||||
{
|
||||
var parameters = new[]
|
||||
var execSql = new StringBuilder("EXEC @RC = [dbo].[PRREC_UPDATE_OBJECT]");
|
||||
var parameters = new List<SqlParameter>();
|
||||
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}");
|
||||
|
||||
Reference in New Issue
Block a user