I am writing this question to get some advice on improving this Database Management library. I'll explain a little about it:
Database Manager - DatabaseManager
is the holder, it generates new connections when the NewConnection
is called, it returns a new DatabaseConnection
with the saved connection string.
Database Connection - DatabaseConnection
is a connection containing a new connection that's created on each call from DatabaseManager
.
Usage:
using (var databaseConnection = Serber.GetDatabase().NewDatabaseConnection)
{
databaseConnection.SetQuery("SELECT * FROM `table` WHERE `enabled` = '1' ORDER BY `name` DESC;");
databaseConnection.Open();
using (MySqlDataReader Reader = databaseConnection.ExecuteReader())
{
while (Reader.Read())
{
try
{
// do some work
}
catch (DatabaseException ex)
{
log.Error("Unable to load item for ID [" + Reader.GetInt32("id") + "]", ex);
}
}
}
}
DatabaseManager:
internal sealed class DatabaseManager
{
private readonly string _connectionString;
public DatabaseManager()
{
var connectionString = new MySqlConnectionStringBuilder
{
ConnectionLifeTime = (60 * 5),
ConnectionTimeout = 30,
Database = Hariak.HariakServer.Config.GetConfigValueByKey("database.mysql.database"),
DefaultCommandTimeout = 120,
Logging = false,
MaximumPoolSize = uint.Parse(Hariak.HariakServer.Config.GetConfigValueByKey("database.mysql.pool_maxsize")),
MinimumPoolSize = uint.Parse(Hariak.HariakServer.Config.GetConfigValueByKey("database.mysql.pool_minsize")),
Password = Hariak.HariakServer.Config.GetConfigValueByKey("database.mysql.password"),
Pooling = Hariak.HariakServer.Config.GetConfigValueByKey("database.mysql.pooling") == "1",
Port = uint.Parse(Hariak.HariakServer.Config.GetConfigValueByKey("database.mysql.port")),
Server = Hariak.HariakServer.Config.GetConfigValueByKey("database.mysql.hostname"),
UseCompression = false,
UserID = Hariak.HariakServer.Config.GetConfigValueByKey("database.mysql.username"),
};
_connectionString = connectionString.ToString();
}
public bool ConnectionWorks()
{
try
{
using (var databaseConnection = NewDatabaseConnection)
{
databaseConnection.OpenConnection();
}
return true;
}
catch (Exception)
{
return false;
}
}
public DatabaseConnection NewDatabaseConnection => new DatabaseConnection(_connectionString);
}
DatabaseConnection:
internal sealed class DatabaseConnection : IDisposable
{
private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
private MySqlConnection _connection;
private List<MySqlParameter> _parameters;
private MySqlCommand _command;
public DatabaseConnection(string connectionString)
{
_connection = new MySqlConnection(connectionString);
_command = _connection.CreateCommand();
}
public void OpenConnection()
{
if (_connection.State == ConnectionState.Open)
{
throw new InvalidOperationException("Connection already open.");
}
_connection.Open();
}
public void AppendParameter(string key, object value)
{
if (_parameters == null)
{
_parameters = new List<MySqlParameter>();
}
_parameters.Add(new MySqlParameter(key, value));
}
public void SetQuery(string query)
{
_command.CommandText = query;
}
public int ExecuteNonQuery()
{
if (_parameters != null && _parameters.Count > 0)
{
_command.Parameters.AddRange(_parameters.ToArray());
}
try
{
return _command.ExecuteNonQuery();
}
catch (MySqlException e)
{
Logger.Error(e, "Database error was logged.");
return 0;
}
finally
{
_command.CommandText = string.Empty;
_command.Parameters.Clear();
if (_parameters != null && _parameters.Count > 0)
{
_parameters.Clear();
}
}
}
public int GetLastId()
{
try
{
return (int)_command.LastInsertedId;
}
catch (MySqlException e)
{
Logger.Error(e, "Database error was logged.");
return 0;
}
finally
{
_command.CommandText = string.Empty;
}
}
public int ExecuteSingleInt()
{
try
{
if (_parameters != null && _parameters.Count > 0)
{
_command.Parameters.AddRange(_parameters.ToArray());
}
return int.Parse(_command.ExecuteScalar().ToString());
}
catch (MySqlException e)
{
Logger.Error(e, "Database error was logged.");
return 0;
}
finally
{
_command.CommandText = string.Empty;
_command.Parameters.Clear();
if (_parameters != null && _parameters.Count > 0)
{
_parameters.Clear();
}
}
}
public bool TryExecuteSingleInt(out int value)
{
try
{
if (_parameters != null && _parameters.Count > 0)
{
_command.Parameters.AddRange(_parameters.ToArray());
}
var scalar = _command.ExecuteScalar();
if (scalar == null)
{
value = 0;
return false;
}
value = int.Parse(scalar.ToString());
return true;
}
catch (MySqlException e)
{
Logger.Error(e, "Database error was logged.");
value = 0;
return false;
}
finally
{
_command.CommandText = string.Empty;
_command.Parameters.Clear();
if (_parameters != null && _parameters.Count > 0)
{
_parameters.Clear();
}
}
}
public MySqlDataReader ExecuteReader()
{
if (_parameters != null && _parameters.Count > 0)
{
_command.Parameters.AddRange(_parameters.ToArray());
}
try
{
return _command.ExecuteReader();
}
catch (MySqlException e)
{
Logger.Error(e, "Database error was logged.");
return null;
}
finally
{
_command.CommandText = string.Empty;
_command.Parameters.Clear();
if (_parameters != null && _parameters.Count > 0)
{
_parameters.Clear();
}
}
}
public DataSet ExecuteDataSet()
{
if (_parameters != null && _parameters.Count > 0)
{
_command.Parameters.AddRange(_parameters.ToArray());
}
var dataSet = new DataSet();
try
{
using (var adapter = new MySqlDataAdapter(_command))
{
adapter.Fill(dataSet);
}
return dataSet;
}
catch (MySqlException e)
{
Logger.Error(e, "Database error was logged.");
return null;
}
finally
{
_command.CommandText = string.Empty;
_command.Parameters.Clear();
if (_parameters != null && _parameters.Count > 0)
{
_parameters.Clear();
}
}
}
public DataTable ExecuteTable()
{
var dataSet = ExecuteDataSet();
return dataSet.Tables.Count > 0 ? dataSet.Tables[0] : null;
}
public DataRow ExecuteRow()
{
var dataTable = ExecuteTable();
return dataTable.Rows.Count > 0 ? dataTable.Rows[0] : null;
}
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool disposing)
{
if (!disposing)
{
return;
}
if (_connection.State == ConnectionState.Open)
{
_connection.Close();
_connection = null;
}
if (_parameters != null)
{
_parameters.Clear();
_parameters = null;
}
if (_command != null)
{
_command.Dispose();
_command = null;
}
}
}