namespace Common.Logic.Extensions.SQL { using Common.Logic.Extensions.SQL.Interfaces; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; public class SQLCommand : ISQLCommand { private readonly SQLConnection sqlConnection; private readonly IDictionary parameters; public SQLCommand(SQLConnection sqlConnection, String commandText) { this.sqlConnection = sqlConnection.EnsureNotNull(nameof(sqlConnection)); this.CommandText = commandText.EnsureNotNullOrWhiteSpace(nameof(commandText)); this.parameters = new Dictionary(); } internal String CommandText { get; } internal SqlParameter[] Parameters => this.parameters.Values.ToArray(); public Int32 ExecuteNonQuery() => this.sqlConnection.ExecuteNonQuery(this); public IEnumerable ExecuteReader(Func expression) { foreach (var result in this.sqlConnection.ExecuteReader(this, expression)) { yield return result; } } public void ExecuteReader(Action expression) { expression.ThrowIfNull(nameof(expression)); this.sqlConnection.ExecuteReader(this, reader => { while (reader.Read()) { expression(reader); } }); } public T ExecuteScalar(Func expression) => this.sqlConnection.ExecuteScalar(this, expression); public T FirstOrDefault(Func expression) => this.sqlConnection.FirstOrDefault(this, expression); public ISQLCommand SetParameter(String name, Object value) { name.ThrowIfNullOrWhiteSpace(nameof(name)); if (value is null) { value = DBNull.Value; } this.parameters[name] = new SqlParameter(name, value); return this; } public ISQLCommand SetParameter(String name, DateTime value) { name.ThrowIfNullOrWhiteSpace(nameof(name)); var sqlDate = new DateTime(1753, 1, 1, 12, 0, 0); if (value < sqlDate) { value = sqlDate; } this.parameters[name] = new SqlParameter(name, value); return this; } } }