Class For Working With Database (Postgres Example)
Mon Aug 22 2022 11:29:45 GMT+0000 (Coordinated Universal Time)
public class PGSQL { private NpgsqlConnection Connection; private NpgsqlTransaction Transaction; public PGSQL(string connectionString = null) { this.Connection = new NpgsqlConnection(connectionString); } ~PGSQL() { this.Dispose(); } public async Task BeginTransactionAsync() { if (this.Connection.State != ConnectionState.Open) { await this.Connection.OpenAsync(); } this.Transaction = this.Connection.BeginTransaction(); } public async Task CommitTransactionAsync() { await this.Transaction?.CommitAsync(); } public async Task RollbackTransactionAsync() { await this.Transaction?.RollbackAsync(); } public IDbDataParameter Parameter(string name, object value, NpgsqlDbType? type = null) { var prm = new NpgsqlParameter(name, value); if (type.HasValue) { prm.NpgsqlDbType = type.Value; } if (value == null) { prm.Value = DBNull.Value; } return prm; } public async Task<DataTable> ExecuteDataTableAsync(string sql, params IDbDataParameter[] parameters) { using (var cmd = new NpgsqlCommand(sql, this.Connection)) using (var adp = new NpgsqlDataAdapter(cmd)) { cmd.Transaction = this.Transaction; if (this.Connection.State != ConnectionState.Open) { await this.Connection.OpenAsync(); } if (parameters.Length > 0) { cmd.Parameters.AddRange(parameters); } var data = new DataTable("data"); adp.Fill(data); return data; } } public async Task<T> ExecuteObjectAsync<T>(string sql, params IDbDataParameter[] parameters) { if (this.Connection.State != ConnectionState.Open) { await this.Connection.OpenAsync(); } var prms = new DbParams(); prms.AddRange(parameters); return await this.Connection.QueryFirstOrDefaultAsync<T>(sql, prms, this.Transaction); } public async Task<List<T>> ExecuteListAsync<T>(string sql, params IDbDataParameter[] parameters) { if (this.Connection.State != ConnectionState.Open) { await this.Connection.OpenAsync(); } var prms = new DbParams(); prms.AddRange(parameters); var data = await this.Connection.QueryAsync<T>(sql, prms, this.Transaction); return new List<T>(data); } public async Task<T> ExecuteScalarAsync<T>(string sql, params IDbDataParameter[] parameters) { using (var cmd = new NpgsqlCommand(sql, this.Connection)) { cmd.Transaction = this.Transaction; if (this.Connection.State != ConnectionState.Open) { await this.Connection.OpenAsync(); } if (parameters.Length > 0) { cmd.Parameters.AddRange(parameters); } object ret = await cmd.ExecuteScalarAsync(); if (ret == null) { return default; } return (T)ret; } } public async Task<List<T>> ExecuteScalarListAsync<T>(string sql, params IDbDataParameter[] parameters) { using (var cmd = new NpgsqlCommand(sql, this.Connection)) { cmd.Transaction = this.Transaction; if (this.Connection.State != ConnectionState.Open) { await this.Connection.OpenAsync(); } if (parameters.Length > 0) { cmd.Parameters.AddRange(parameters); } var result = new List<T>(); using (var r = await cmd.ExecuteReaderAsync()) { if (!r.HasRows) { return result; } while (await r.ReadAsync()) { T value = await r.GetFieldValueAsync<T>(0); result.Add(value); } } return result; } } public async Task<int> ExecuteNonQueryAsync(string sql, params IDbDataParameter[] parameters) { using (var cmd = new NpgsqlCommand(sql, this.Connection)) { cmd.Transaction = this.Transaction; if (this.Connection.State != ConnectionState.Open) { await this.Connection.OpenAsync(); } if (parameters.Length > 0) { cmd.Parameters.AddRange(parameters); } return await cmd.ExecuteNonQueryAsync(); } } public void Dispose() { this.Transaction?.Dispose(); this.Transaction = null; this.Connection?.Dispose(); this.Connection = null; } public Task TryOpenConnection() { throw new NotImplementedException(); } public void CloseConnection() { this.Connection?.Close(); } public void RecreateConnection() { throw new NotImplementedException(); } } // Dapper public class DbParams : Dapper.SqlMapper.IDynamicParameters, IEnumerable<IDbDataParameter> { private readonly List<IDbDataParameter> parameters = new List<IDbDataParameter>(); public IEnumerator<IDbDataParameter> GetEnumerator() { return parameters.GetEnumerator(); } public void Add(IDbDataParameter value) { parameters.Add(value); } public void AddRange(IEnumerable<IDbDataParameter> values) { parameters.AddRange(values); } void Dapper.SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, Dapper.SqlMapper.Identity identity) { foreach (IDbDataParameter parameter in parameters) command.Parameters.Add(parameter); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
Comments