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:
@@ -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}");
|
||||
}
|
||||
Reference in New Issue
Block a user