using System.Data; using Elsa.Sql.Client; using Elsa.Sql.Models; using Microsoft.Data.SqlClient; namespace Elsa.Sql.SqlServer; public class SqlServerClient : BaseSqlClient, ISqlClient { private string? _connectionString; /// /// Microsoft SQL server client implementation. /// /// public SqlServerClient(string? connectionString) => _connectionString = connectionString; /// /// /// public async Task ExecuteCommandAsync(EvaluatedQuery evaluatedQuery) { using var connection = new SqlConnection(_connectionString); connection.Open(); var command = new SqlCommand(evaluatedQuery.Query, connection); AddParameters(command, evaluatedQuery.Parameters); var result = await command.ExecuteNonQueryAsync(); return result; } /// /// /// public async Task ExecuteScalarAsync(EvaluatedQuery evaluatedQuery) { using var connection = new SqlConnection(_connectionString); connection.Open(); var command = new SqlCommand(evaluatedQuery.Query, connection); AddParameters(command, evaluatedQuery.Parameters); var result = await command.ExecuteScalarAsync(); return result; } /// /// /// public async Task ExecuteQueryAsync(EvaluatedQuery evaluatedQuery) { using var connection = new SqlConnection(_connectionString); connection.Open(); var command = new SqlCommand(evaluatedQuery.Query, connection); AddParameters(command, evaluatedQuery.Parameters); using var reader = await command.ExecuteReaderAsync(); return await Task.FromResult(ReadAsDataSet(reader)); } /// /// Inject parameters into the query to prevent SQL injection. /// /// Command to add the parameters to /// Parameters to add /// private SqlCommand AddParameters(SqlCommand command, Dictionary parameters) { foreach (var param in parameters) { command.Parameters.AddWithValue(param.Key, param.Value ?? DBNull.Value); } return command; } }