mirror of
https://github.com/Tribufu/ServerManagers
synced 2026-08-10 13:11:06 +00:00
368 lines
14 KiB
C#
368 lines
14 KiB
C#
using System;
|
|
using System.Data;
|
|
using System.Data.Common;
|
|
|
|
namespace ConanData.Database
|
|
{
|
|
public sealed class Connection : IDisposable
|
|
{
|
|
#region Structures, Constants and Enums
|
|
public const int DEFAULT_COMMAND_TIMEOUT = 300;
|
|
#endregion
|
|
|
|
#region Constructors, Destructors and Dispose
|
|
private Connection(string connectionString)
|
|
{
|
|
ConnectionString = connectionString;
|
|
}
|
|
~Connection()
|
|
{
|
|
Dispose();
|
|
}
|
|
public void Dispose()
|
|
{
|
|
DeregisterConnection();
|
|
}
|
|
#endregion
|
|
|
|
#region Properties
|
|
public string ConnectionString { get; set; } = string.Empty;
|
|
public System.Data.SQLite.SQLiteConnection DBConnection { get; set; } = null;
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
#region Connection
|
|
public static Connection CreateConnection(string connectionString, bool openConnection = false)
|
|
{
|
|
var connection = new Connection(connectionString);
|
|
if (openConnection)
|
|
{
|
|
connection.RegisterConnection();
|
|
}
|
|
return connection;
|
|
}
|
|
public void DeregisterConnection()
|
|
{
|
|
if (DBConnection != null && DBConnection.State != ConnectionState.Closed)
|
|
{
|
|
DBConnection?.Close();
|
|
DBConnection?.Dispose();
|
|
}
|
|
DBConnection = null;
|
|
}
|
|
private DbConnection GetConnection()
|
|
{
|
|
if (DBConnection == null || DBConnection.State == ConnectionState.Closed)
|
|
{
|
|
throw new InvalidOperationException("You must register a connection to the Database.");
|
|
}
|
|
|
|
return DBConnection;
|
|
}
|
|
public void RegisterConnection()
|
|
{
|
|
if (DBConnection == null || DBConnection.State == ConnectionState.Closed)
|
|
{
|
|
DBConnection = new System.Data.SQLite.SQLiteConnection(ConnectionString);
|
|
DBConnection.Open();
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region Command
|
|
public DbCommand GetCommand()
|
|
{
|
|
DbConnection connection = GetConnection();
|
|
DbCommand command = connection.CreateCommand();
|
|
return command;
|
|
}
|
|
private static void SetCommandTimeout(DbCommand command, int commandTimeout)
|
|
{
|
|
if (command == null)
|
|
{
|
|
return;
|
|
}
|
|
commandTimeout = Math.Max(0, commandTimeout);
|
|
|
|
try
|
|
{
|
|
command.CommandTimeout = commandTimeout;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.Message);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region DataAdapter
|
|
private DbDataAdapter GetNewDataAdapter()
|
|
{
|
|
return new System.Data.SQLite.SQLiteDataAdapter();
|
|
}
|
|
#endregion
|
|
|
|
#region DataReader
|
|
public DbDataReader ExecuteReader(string commandText, DbParameter[] parameters, CommandType commandType)
|
|
{
|
|
return ExecuteReader(commandText, parameters, commandType, DEFAULT_COMMAND_TIMEOUT, CommandBehavior.Default);
|
|
}
|
|
public DbDataReader ExecuteReader(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout)
|
|
{
|
|
return ExecuteReader(commandText, parameters, commandType, commandTimeout, CommandBehavior.Default);
|
|
}
|
|
public DbDataReader ExecuteReader(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout, CommandBehavior commandBehavior)
|
|
{
|
|
DbCommand command = null;
|
|
DbDataReader reader = null;
|
|
|
|
try
|
|
{
|
|
command = GetCommand();
|
|
command.CommandText = commandText;
|
|
command.CommandType = commandType;
|
|
SetCommandTimeout(command, commandTimeout >= 0 ? commandTimeout : DEFAULT_COMMAND_TIMEOUT);
|
|
|
|
if (parameters != null)
|
|
{
|
|
ValidateNullParameters(parameters);
|
|
foreach (DbParameter parameter in parameters)
|
|
{
|
|
command.Parameters.Add(parameter);
|
|
}
|
|
}
|
|
|
|
reader = command.ExecuteReader(commandBehavior);
|
|
}
|
|
catch
|
|
{
|
|
if (reader != null && reader.IsClosed == false)
|
|
{
|
|
reader.Close();
|
|
}
|
|
if (command != null)
|
|
{
|
|
command.Dispose();
|
|
}
|
|
throw;
|
|
}
|
|
|
|
return reader;
|
|
}
|
|
#endregion
|
|
|
|
#region DataSet
|
|
public DataSet ExecuteDataSet(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout)
|
|
{
|
|
DataSet dataSet = new DataSet();
|
|
string[] tableNames = null;
|
|
FillDataSet(commandText, parameters, commandType, commandTimeout, dataSet, tableNames);
|
|
return dataSet;
|
|
}
|
|
public DataSet ExecuteDataSet(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout, string[] tableNames)
|
|
{
|
|
DataSet dataSet = new DataSet();
|
|
FillDataSet(commandText, parameters, commandType, commandTimeout, dataSet, tableNames);
|
|
return dataSet;
|
|
}
|
|
public void ExecuteDataSet(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout, DataSet dataSet)
|
|
{
|
|
string[] tableNames = null;
|
|
FillDataSet(commandText, parameters, commandType, commandTimeout, dataSet, tableNames);
|
|
}
|
|
public void ExecuteDataSet(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout, DataSet dataSet, string[] tableNames)
|
|
{
|
|
FillDataSet(commandText, parameters, commandType, commandTimeout, dataSet, tableNames);
|
|
}
|
|
public void FillDataSet(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout, DataSet dataSet, string[] tableNames)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(commandText))
|
|
{
|
|
throw new ArgumentNullException("commandText", "The parameter 'commandText' cannot be null");
|
|
}
|
|
|
|
if (dataSet == null)
|
|
{
|
|
throw new ArgumentNullException("dataSet", "The parameter 'dataSet' cannot be null");
|
|
}
|
|
|
|
// Initialise command object
|
|
DbCommand command = GetCommand();
|
|
command.CommandText = commandText;
|
|
command.CommandType = commandType;
|
|
SetCommandTimeout(command, commandTimeout >= 0 ? commandTimeout : DEFAULT_COMMAND_TIMEOUT);
|
|
|
|
if (parameters != null)
|
|
{
|
|
ValidateNullParameters(parameters);
|
|
|
|
// Initialise command object parameters
|
|
foreach (DbParameter parameter in parameters)
|
|
{
|
|
command.Parameters.Add(parameter);
|
|
}
|
|
}
|
|
|
|
FillDataSet(command, dataSet, tableNames);
|
|
|
|
command.Dispose();
|
|
}
|
|
public void FillDataSet(DbCommand selectCommand, DataSet dataSet, string[] tableNames)
|
|
{
|
|
if (selectCommand == null)
|
|
{
|
|
throw new ArgumentNullException("selectCommand", "The parameter 'selectCommand' cannot be null");
|
|
}
|
|
|
|
if (dataSet == null)
|
|
{
|
|
throw new ArgumentNullException("dataSet", "The parameter 'dataSet' cannot be null");
|
|
}
|
|
|
|
// Create the DataAdapter
|
|
DbDataAdapter dataAdapter = GetNewDataAdapter();
|
|
|
|
// Add the table mappings specified by the user
|
|
if (tableNames != null && tableNames.Length > 0)
|
|
{
|
|
for (int i = 0; i < tableNames.Length; i++)
|
|
{
|
|
string tableName = (i == 0) ? "Table" : String.Format("Table{0}", i);
|
|
if (string.IsNullOrWhiteSpace(tableNames[i]))
|
|
{
|
|
throw new ArgumentException("The parameter 'tableNames' must contain a list of tables - a value was provided as null or empty string.", "tableNames");
|
|
}
|
|
dataAdapter.TableMappings.Add(tableName, tableNames[i]);
|
|
}
|
|
}
|
|
|
|
dataAdapter.SelectCommand = selectCommand;
|
|
if (dataAdapter.SelectCommand.Connection == null)
|
|
{
|
|
dataAdapter.SelectCommand.Connection = GetConnection();
|
|
}
|
|
dataAdapter.Fill(dataSet);
|
|
}
|
|
#endregion
|
|
|
|
#region DataTable
|
|
public DataTable ExecuteDataTable(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout)
|
|
{
|
|
DataTable dataTable = new DataTable();
|
|
FillDataTable(commandText, parameters, commandType, commandTimeout, dataTable, null);
|
|
return dataTable;
|
|
}
|
|
public DataTable ExecuteDataTable(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout, string tableName)
|
|
{
|
|
DataTable dataTable = new DataTable();
|
|
FillDataTable(commandText, parameters, commandType, commandTimeout, dataTable, tableName);
|
|
return dataTable;
|
|
}
|
|
public void ExecuteDataTable(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout, DataTable dataTable)
|
|
{
|
|
FillDataTable(commandText, parameters, commandType, commandTimeout, dataTable, null);
|
|
}
|
|
public void ExecuteDataTable(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout, DataTable dataTable, string tableName)
|
|
{
|
|
FillDataTable(commandText, parameters, commandType, commandTimeout, dataTable, tableName);
|
|
}
|
|
public void FillDataTable(string commandText, DbParameter[] parameters, CommandType commandType, int commandTimeout, DataTable dataTable, string tableName)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(commandText))
|
|
{
|
|
throw new ArgumentNullException("commandText", "The parameter 'commandText' cannot be null");
|
|
}
|
|
|
|
if (dataTable == null)
|
|
{
|
|
throw new ArgumentNullException("dataTable", "The parameter 'dataTable' cannot be null");
|
|
}
|
|
|
|
// Initialise command object
|
|
DbCommand command = GetCommand();
|
|
command.CommandText = commandText;
|
|
command.CommandType = commandType;
|
|
SetCommandTimeout(command, commandTimeout >= 0 ? commandTimeout : DEFAULT_COMMAND_TIMEOUT);
|
|
|
|
if (parameters != null)
|
|
{
|
|
ValidateNullParameters(parameters);
|
|
|
|
// Initialise command object parameters
|
|
foreach (DbParameter parameter in parameters)
|
|
{
|
|
command.Parameters.Add(parameter);
|
|
}
|
|
}
|
|
|
|
FillDataTable(command, dataTable, tableName);
|
|
|
|
command.Dispose();
|
|
}
|
|
public void FillDataTable(DbCommand selectCommand, DataTable dataTable, string tableName)
|
|
{
|
|
if (selectCommand == null)
|
|
{
|
|
throw new ArgumentNullException("selectCommand", "The parameter 'selectCommand' cannot be null");
|
|
}
|
|
|
|
if (dataTable == null)
|
|
{
|
|
throw new ArgumentNullException("dataTable", "The parameter 'dataTable' cannot be null");
|
|
}
|
|
|
|
// Create the DataAdapter
|
|
DbDataAdapter dataAdapter = GetNewDataAdapter();
|
|
|
|
// Add the table mappings specified by the user
|
|
if (!string.IsNullOrWhiteSpace(tableName))
|
|
{
|
|
dataAdapter.TableMappings.Add("Table", tableName);
|
|
}
|
|
|
|
dataAdapter.SelectCommand = selectCommand;
|
|
if (dataAdapter.SelectCommand.Connection == null)
|
|
{
|
|
dataAdapter.SelectCommand.Connection = GetConnection();
|
|
}
|
|
dataAdapter.Fill(dataTable);
|
|
}
|
|
#endregion
|
|
|
|
#region Parameter
|
|
public DbParameter CreateParameter(string parameterName, ParameterDirection direction)
|
|
{
|
|
DbParameter parameter = new System.Data.SQLite.SQLiteParameter();
|
|
parameter.ParameterName = parameterName;
|
|
parameter.Direction = direction;
|
|
return parameter;
|
|
}
|
|
public DbParameter CreateParameter(string parameterName, ParameterDirection direction, object value)
|
|
{
|
|
DbParameter parameter = CreateParameter(parameterName, direction);
|
|
parameter.Value = value;
|
|
return parameter;
|
|
}
|
|
public DbParameter CreateParameter(string parameterName, ParameterDirection direction, string sourceColumn, DataRowVersion sourceVersion)
|
|
{
|
|
DbParameter parameter = CreateParameter(parameterName, direction);
|
|
parameter.SourceColumn = sourceColumn;
|
|
parameter.SourceVersion = sourceVersion;
|
|
return parameter;
|
|
}
|
|
public static void ValidateNullParameters(DbParameter[] parameters)
|
|
{
|
|
foreach (DbParameter param in parameters)
|
|
{
|
|
if (param.Value == null)
|
|
{
|
|
param.Value = DBNull.Value;
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#endregion
|
|
}
|
|
}
|