namespace LaaProductionWeb.Data { using LaaProductionWeb.Data.Interfaces; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; public class SqlClient : ISqlClient { private readonly string connectionString; public SqlClient(string connectionString) => this.connectionString = connectionString; public SQLCommand CreateCommand(string commandText) => new SQLCommand(this, commandText); public int ExecuteNonQuery(string query, Action parameters, SqlInfoMessageEventHandler errorCallback = null) { var rowsAffected = 0; using (var sqlConnection = new SqlConnection(this.connectionString)) { sqlConnection.OpenWithErrorHandling(errorCallback); using (var sqlCommand = sqlConnection.CreateCommand()) { parameters(sqlCommand.Parameters); sqlCommand.CommandText = query; rowsAffected = sqlCommand.ExecuteNonQuery(); } } return rowsAffected; } public IEnumerable ExecuteReader(string query, Func reader, SqlInfoMessageEventHandler errorCallback = null) { using (var sqlConnection = new SqlConnection(this.connectionString)) { sqlConnection.OpenWithErrorHandling(errorCallback); using (var sqlCommand = sqlConnection.CreateCommand()) { sqlCommand.CommandText = query; using (SqlReader sqlReader = sqlCommand.ExecuteReader()) { while (sqlReader.Read()) { yield return reader(sqlReader); } } } } } public IEnumerable ExecuteReader(string query, Action parameters, Func reader, SqlInfoMessageEventHandler errorCallback = null) { using (var sqlConnection = new SqlConnection(this.connectionString)) { sqlConnection.OpenWithErrorHandling(errorCallback); using (var sqlCommand = sqlConnection.CreateCommand()) { parameters(sqlCommand.Parameters); sqlCommand.CommandText = query; using (SqlReader sqlReader = sqlCommand.ExecuteReader()) { while (sqlReader.Read()) { yield return reader(sqlReader); } } } } } public IEnumerable ExecuteReader(string query, Func reader, Action columns, SqlInfoMessageEventHandler errorCallback = null) { using (var sqlConnection = new SqlConnection(this.connectionString)) { sqlConnection.OpenWithErrorHandling(errorCallback); using (var sqlCommand = sqlConnection.CreateCommand()) { sqlCommand.CommandText = query; using (SqlReader sqlReader = sqlCommand.ExecuteReader()) { columns(sqlReader.GetColumns()); while (sqlReader.Read()) { yield return reader(sqlReader); } } } } } public IEnumerable ExecuteReader(string query, Action parameters, Func reader, Action columns, SqlInfoMessageEventHandler errorCallback = null) { using (var sqlConnection = new SqlConnection(this.connectionString)) { sqlConnection.OpenWithErrorHandling(errorCallback); using (var sqlCommand = sqlConnection.CreateCommand()) { parameters(sqlCommand.Parameters); sqlCommand.CommandText = query; using (SqlReader sqlReader = sqlCommand.ExecuteReader()) { columns(sqlReader.GetColumns()); while (sqlReader.Read()) { yield return reader(sqlReader); } } } } } public T ExecuteScalar(string query, Action parameters, SqlInfoMessageEventHandler errorCallback = null) { var scalarResult = default(T); using (var sqlConnection = new SqlConnection(this.connectionString)) { sqlConnection.OpenWithErrorHandling(errorCallback); using (var sqlCommand = sqlConnection.CreateCommand()) { parameters(sqlCommand.Parameters); sqlCommand.CommandText = query; var scalarObject = sqlCommand.ExecuteScalar(); if (scalarObject is T scalarValue) { scalarResult = scalarValue; } } } return scalarResult; } internal T FirstOrDefault(SQLCommand command, Func expression) { var firstOrDefaultResult = default(T); using (var sqlConnection = new SqlConnection(this.connectionString)) { sqlConnection.OpenWithErrorHandling(); using (var sqlCommand = sqlConnection.CreateCommand()) { sqlCommand.CommandText = command.CommandText; sqlCommand.Parameters.AddRange(command.Parameters); using (SqlReader sqlReader = sqlCommand.ExecuteReader(CommandBehavior.SequentialAccess)) { if (sqlReader.Read()) { firstOrDefaultResult = expression(sqlReader); } } } } return firstOrDefaultResult; } public T FirstOrDefault(string query, Func reader, SqlInfoMessageEventHandler errorCallback = null) { var firstOrDefaultResult = default(T); using (var sqlConnection = new SqlConnection(this.connectionString)) { sqlConnection.OpenWithErrorHandling(errorCallback); using (var sqlCommand = sqlConnection.CreateCommand()) { sqlCommand.CommandText = query; using (SqlReader sqlReader = sqlCommand.ExecuteReader(CommandBehavior.SequentialAccess)) { if (sqlReader.Read()) { firstOrDefaultResult = reader(sqlReader); } } } } return firstOrDefaultResult; } public T FirstOrDefault(string query, Action parameters, Func reader, SqlInfoMessageEventHandler errorCallback = null) { var firstOrDefaultResult = default(T); using (var sqlConnection = new SqlConnection(this.connectionString)) { sqlConnection.OpenWithErrorHandling(errorCallback); using (var sqlCommand = sqlConnection.CreateCommand()) { parameters(sqlCommand.Parameters); sqlCommand.CommandText = query; using (SqlReader sqlReader = sqlCommand.ExecuteReader(CommandBehavior.SequentialAccess)) { if (sqlReader.Read()) { firstOrDefaultResult = reader(sqlReader); } } } } return firstOrDefaultResult; } } }