2025-01-01 23:14:09 +00:00
|
|
|
|
using System.Data;
|
|
|
|
|
|
using Elsa.Sql.Client;
|
2025-03-15 01:26:11 +00:00
|
|
|
|
using Elsa.Sql.Models;
|
2025-01-01 23:14:09 +00:00
|
|
|
|
using Microsoft.Data.SqlClient;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Elsa.Sql.SqlServer;
|
|
|
|
|
|
|
|
|
|
|
|
public class SqlServerClient : BaseSqlClient, ISqlClient
|
|
|
|
|
|
{
|
|
|
|
|
|
private string? _connectionString;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2025-03-15 01:26:11 +00:00
|
|
|
|
/// Microsoft SQL server client implementation.
|
2025-01-01 23:14:09 +00:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="connectionString"></param>
|
|
|
|
|
|
public SqlServerClient(string? connectionString) => _connectionString = connectionString;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
|
/// </summary>
|
2025-03-15 01:26:11 +00:00
|
|
|
|
public async Task<int?> ExecuteCommandAsync(EvaluatedQuery evaluatedQuery)
|
2025-01-01 23:14:09 +00:00
|
|
|
|
{
|
|
|
|
|
|
using var connection = new SqlConnection(_connectionString);
|
|
|
|
|
|
connection.Open();
|
2025-03-15 01:26:11 +00:00
|
|
|
|
var command = new SqlCommand(evaluatedQuery.Query, connection);
|
|
|
|
|
|
AddParameters(command, evaluatedQuery.Parameters);
|
2025-01-01 23:14:09 +00:00
|
|
|
|
|
|
|
|
|
|
var result = await command.ExecuteNonQueryAsync();
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
|
/// </summary>
|
2025-03-15 01:26:11 +00:00
|
|
|
|
public async Task<object?> ExecuteScalarAsync(EvaluatedQuery evaluatedQuery)
|
2025-01-01 23:14:09 +00:00
|
|
|
|
{
|
|
|
|
|
|
using var connection = new SqlConnection(_connectionString);
|
|
|
|
|
|
connection.Open();
|
2025-03-15 01:26:11 +00:00
|
|
|
|
var command = new SqlCommand(evaluatedQuery.Query, connection);
|
|
|
|
|
|
AddParameters(command, evaluatedQuery.Parameters);
|
2025-01-01 23:14:09 +00:00
|
|
|
|
|
|
|
|
|
|
var result = await command.ExecuteScalarAsync();
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
|
/// </summary>
|
2025-03-15 01:26:11 +00:00
|
|
|
|
public async Task<DataSet?> ExecuteQueryAsync(EvaluatedQuery evaluatedQuery)
|
2025-01-01 23:14:09 +00:00
|
|
|
|
{
|
|
|
|
|
|
using var connection = new SqlConnection(_connectionString);
|
|
|
|
|
|
connection.Open();
|
2025-03-15 01:26:11 +00:00
|
|
|
|
var command = new SqlCommand(evaluatedQuery.Query, connection);
|
|
|
|
|
|
AddParameters(command, evaluatedQuery.Parameters);
|
2025-01-01 23:14:09 +00:00
|
|
|
|
|
|
|
|
|
|
using var reader = await command.ExecuteReaderAsync();
|
|
|
|
|
|
return await Task.FromResult(ReadAsDataSet(reader));
|
|
|
|
|
|
}
|
2025-03-15 01:26:11 +00:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Inject parameters into the query to prevent SQL injection.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="command">Command to add the parameters to</param>
|
|
|
|
|
|
/// <param name="parameters">Parameters to add</param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
private SqlCommand AddParameters(SqlCommand command, Dictionary<string, object?> parameters)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var param in parameters)
|
|
|
|
|
|
{
|
|
|
|
|
|
command.Parameters.AddWithValue(param.Key, param.Value ?? DBNull.Value);
|
|
|
|
|
|
}
|
|
|
|
|
|
return command;
|
|
|
|
|
|
}
|
2025-01-01 23:14:09 +00:00
|
|
|
|
}
|