namespace Common.Logic.Extensions.SQL { using Common.Logic.Extensions.SQL.Interfaces; using System; using System.Data.SqlClient; using System.Diagnostics; public class SQLReader : ISQLReader, IDisposable { private readonly SqlDataReader sqlDataReader; private SQLReader(SqlDataReader sqlDataReader) => this.sqlDataReader = sqlDataReader.EnsureNotNull(nameof(sqlDataReader)); public void Dispose() { this.sqlDataReader.Close(); this.sqlDataReader.Dispose(); } public T GetValue(Int32 index) { var value = default(T); if (0 <= index && index < this.sqlDataReader.FieldCount) { if (!this.sqlDataReader.IsDBNull(index)) { var readedValue = this.sqlDataReader.GetValue(index); var type = Nullable.GetUnderlyingType(typeof(T)); if (type is null) { type = typeof(T); } var tryParse = true; if (tryParse) { try { readedValue = Convert.ChangeType(readedValue, type); tryParse = false; } catch (Exception e) { Debug.Print(e.ToString()); } } if (tryParse) { try { readedValue = Enum.Parse(type, $"{readedValue}", true); tryParse = false; } catch (Exception e) { Debug.Print(e.ToString()); } } if (!tryParse && readedValue is T expectedValue) { value = expectedValue; } } } return value; } internal Boolean Read() => this.sqlDataReader.Read(); public static implicit operator SQLReader(SqlDataReader sqlDataReader) => new SQLReader(sqlDataReader); } }