Here is a wrapper to a MySQL connection.
First I have a DatabaseController
and then a DatabaseConnection
.
How I use this is shown below.
using (var dbConnection = Program.DatabaseController.NewConnection)
{
}
Here is the full code for both classes.
internal sealed class DatabaseController
{
private readonly string _connectionString;
public DatabaseController(string connectionString)
{
_connectionString = connectionString;
}
public DatabaseConnection Connection => new DatabaseConnection(_connectionString);
public bool ConnectionWorks()
{
try
{
using (Connection)
{
}
return true;
}
catch (Exception)
{
return false;
}
}
}
internal sealed class DatabaseConnection : IDisposable
{
private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
private MySqlCommand _command;
private MySqlConnection _connection;
private List<MySqlParameter> _parameters;
public DatabaseConnection(string connectionString)
{
_connection = new MySqlConnection(connectionString);
_command = _connection.CreateCommand();
OpenConnection();
}
public void Dispose()
{
Dispose(true);
}
private 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;
_command.Parameters.Clear();
if (_parameters != null && _parameters.Count > 0)
{
_parameters.Clear();
}
}
}
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 string ExecuteSingleString()
{
try
{
if (_parameters != null && _parameters.Count > 0)
{
_command.Parameters.AddRange(_parameters.ToArray());
}
return _command.ExecuteScalar().ToString();
}
catch (MySqlException e)
{
Logger.Error(e, "Database error was logged.");
return "";
}
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;
}
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)
{
return;
}
_command.Dispose();
_command = null;
}
}
NewConnection
property defined on the connection? \$\endgroup\$