using Ems.BusinessTracker.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
namespace Ems.BusinessTracker.DataAccess.Common
{
public abstract class BaseDatabaseHandler
{
protected string CONNECTIONSTRING;
private readonly ILogger Logger;
protected BaseDatabaseHandler()
{
CONNECTIONSTRING = ConfigurationManager.ConnectionStrings[Constants.ConnectionStringName].ConnectionString;
Logger = MlsLogger.Instance;
}
protected Database GetSQLDatabase(string connectionString = null)
{
return string.IsNullOrEmpty(connectionString) ? new SqlDatabase(CONNECTIONSTRING) : new SqlDatabase(connectionString);
}
protected void AddWhereClause(ref string query, QueryParamList pParams)
{
query += " WHERE 1=1 ";
if (pParams.Count > 0)
{
foreach (QueryParamObj item in pParams)
{
query += " AND " + item.ParamName + " = @" + item.ParamName;
}
}
}
protected void AddWhereClause(ref string query, QueryParamList pParams, string prefix)
{
query += " WHERE 1=1 ";
if (pParams.Count > 0)
{
foreach (QueryParamObj item in pParams)
{
if (item.ParamValue != null)
query += " AND " + prefix + item.ParamName + " = @" + item.ParamName;
else
{
query += " AND " + prefix + item.ParamName + " IS NULL ";
}
}
}
}
protected DataSet GetSPResultSetEx(string storedProcName, QueryParamList spParams, ref string pErrString)
{
Database db = GetSQLDatabase();
var ds = new DataSet();
try
{
using (DbCommand cmd = db.GetStoredProcCommand(storedProcName))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
ds = db.ExecuteDataSet(cmd);
}
}
catch (Exception ex)
{
pErrString = ex.Message;
Logger.LogException(ex);
}
return ds;
}
protected void DBExecSPInOutEx(string storedProcName, ref QueryParamList spParams, int pCommandTimeout, ref string pErrString)
{
Database db = GetSQLDatabase();
DbCommand cmd = db.GetStoredProcCommand(storedProcName);
if (pCommandTimeout > 0)
{
cmd.CommandTimeout = pCommandTimeout;
}
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddParameter(cmd, obj.ParamName, obj.DBType, obj.ParamDirection, null, DataRowVersion.Current, obj.ParamValue);
}
}
try
{
db.ExecuteNonQuery(cmd);
}
catch (Exception ex)
{
pErrString = ex.Message;
Logger.LogException(ex);
}
finally
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
obj.ParamValue = db.GetParameterValue(cmd, obj.ParamName);
}
}
CloseConnection(cmd);
}
}
protected void DBExecSPInOutWithSizeEx(string storedProcName, ref QueryParamList spParams, int pCommandTimeout, ref string pErrString)
{
Database db = GetSQLDatabase();
DbCommand cmd = db.GetStoredProcCommand(storedProcName);
if (pCommandTimeout > 0)
{
cmd.CommandTimeout = pCommandTimeout;
}
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
if (obj.ParamLen > 0)
db.AddParameter(cmd, obj.ParamName, obj.DBType, obj.ParamLen, obj.ParamDirection, true, 0, 1, null, DataRowVersion.Current, obj.ParamValue);
else
db.AddParameter(cmd, obj.ParamName, obj.DBType, obj.ParamDirection, null, DataRowVersion.Current, obj.ParamValue);
}
}
try
{
db.ExecuteNonQuery(cmd);
}
catch (Exception ex)
{
pErrString = ex.Message;
Logger.LogException(ex);
}
finally
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
obj.ParamValue = db.GetParameterValue(cmd, obj.ParamName);
}
}
CloseConnection(cmd);
}
}
protected void DBExecSPInOutWithSizeEx(string storedProcName, ref QueryParamList spParams, int pCommandTimeout, ref string pErrString, string connString)
{
Database db = GetSQLDatabase(connString);
DbCommand cmd = db.GetStoredProcCommand(storedProcName);
if (pCommandTimeout > 0)
{
cmd.CommandTimeout = pCommandTimeout;
}
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
if (obj.ParamLen > 0)
db.AddParameter(cmd, obj.ParamName, obj.DBType, obj.ParamLen, obj.ParamDirection, true, 0, 1, null, DataRowVersion.Current, obj.ParamValue);
else
db.AddParameter(cmd, obj.ParamName, obj.DBType, obj.ParamDirection, null, DataRowVersion.Current, obj.ParamValue);
}
}
try
{
db.ExecuteNonQuery(cmd);
}
catch (Exception ex)
{
pErrString = ex.Message;
Logger.LogException(ex);
}
finally
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
obj.ParamValue = db.GetParameterValue(cmd, obj.ParamName);
}
}
CloseConnection(cmd);
}
}
///
/// Executes a stored procedure on the live config db with parameters specifying the company
///
///
///
///
protected void DBExecStoredProc(string storedProcName, QueryParamList spParams, ref string pErrString)
{
Database db = GetSQLDatabase();
using (DbCommand cmd = db.GetStoredProcCommand(storedProcName))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
try
{
db.ExecuteNonQuery(cmd);
}
catch (Exception ex)
{
pErrString = ex.Message;
Logger.LogException(ex);
}
}
}
protected void DBExecStoredProc(string storedProcName, QueryParamList spParams, ref string pErrString, string connectionString)
{
Database db = GetSQLDatabase(connectionString);
using (DbCommand cmd = db.GetStoredProcCommand(storedProcName))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
try
{
db.ExecuteNonQuery(cmd);
}
catch (Exception ex)
{
pErrString = ex.Message;
Logger.LogException(ex);
}
}
}
///
/// Executes a stored procedure on the live config db with parameters specifying the company with transaction parameter to do transaction management
///
///
///
///
///
///
protected int DBExecStoredProcInTran(Database db, DbCommand cmd, QueryParamList spParams, DbTransaction pTransaction)
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
if (obj.ParamLen > 0)
db.AddParameter(cmd, obj.ParamName, obj.DBType, obj.ParamLen, obj.ParamDirection, true, 0, 1, null, DataRowVersion.Current, obj.ParamValue);
else
db.AddParameter(cmd, obj.ParamName, obj.DBType, obj.ParamDirection, null, DataRowVersion.Current, obj.ParamValue);
}
}
return db.ExecuteNonQuery(cmd, pTransaction);
}
protected int DBExecStoredProcInTranReturnsIdentity(Database db, DbCommand cmd, QueryParamList spParams, DbTransaction pTransaction)
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
object identity = db.ExecuteScalar(cmd, pTransaction);
return identity != DBNull.Value ? Convert.ToInt32(identity) : -1;
}
///
///Private Metod that executes a sql command on specified db that does not return a resultset
///
///
///
///
///
protected bool DBExecCommandEx(string query, QueryParamList spParams, Database db, ref string pErrString)
{
try
{
using (DbCommand cmd = db.GetSqlStringCommand(query))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
db.ExecuteNonQuery(cmd);
}
}
catch (Exception e)
{
pErrString = e.Message;
Logger.LogException(e);
return false;
}
return true;
}
protected bool DBExecCommandEx(string query, QueryParamList spParams, ref string pErrString)
{
Database db = GetSQLDatabase();
return DBExecCommandEx(query, spParams, db, ref pErrString);
}
protected bool DBExecCommandEx(string query, QueryParamList spParams, ref string pErrString, string connString)
{
Database db = GetSQLDatabase(connString);
return DBExecCommandEx(query, spParams, db, ref pErrString);
}
protected int DBExecCommandExTran(string query, QueryParamList spParams, DbTransaction pTransaction, Database db, ref string pErrString)
{
DbCommand cmd = db.GetSqlStringCommand(query);
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
return db.ExecuteNonQuery(cmd, pTransaction);
}
protected DataSet LoadDataSet(string query, QueryParamList spParams, string tableName, ref string pErrString)
{
Database db = GetSQLDatabase();
DataSet ds = new DataSet();
try
{
using (DbCommand cmd = db.GetSqlStringCommand(query))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
db.LoadDataSet(cmd, ds, tableName);
}
}
catch (Exception e)
{
pErrString = e.Message;
Logger.LogException(e);
}
return ds;
}
protected object DBExecuteScalar(string query, QueryParamList spParams, ref string pErrString)
{
Database db = GetSQLDatabase();
object result = null;
try
{
using (DbCommand cmd = db.GetSqlStringCommand(query))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
result = db.ExecuteScalar(cmd);
}
}
catch (Exception e)
{
pErrString = e.Message;
Logger.LogException(e);
}
return result;
}
protected object DBExecuteScalar(string query, QueryParamList spParams, DbTransaction pTransaction, Database db)
{
object result = null;
using (DbCommand cmd = db.GetSqlStringCommand(query))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
result = db.ExecuteScalar(cmd, pTransaction);
}
return result;
}
protected object DBExecuteScalarSP(string spName, QueryParamList spParams, Database db)
{
object result = null;
using (DbCommand cmd = db.GetStoredProcCommand(spName))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
try
{
result = db.ExecuteScalar(cmd);
}
catch (Exception ex)
{
Logger.LogException(ex);
}
}
return result;
}
protected object DBExecuteScalarSP(string spName, QueryParamList spParams)
{
object result = null;
Database db = GetSQLDatabase();
using (DbCommand cmd = db.GetStoredProcCommand(spName))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
try
{
result = db.ExecuteScalar(cmd);
}
catch (Exception ex)
{
Logger.LogException(ex);
}
}
return result;
}
protected object DBExecuteScalarSP(string spName, QueryParamList spParams, DbTransaction pTransaction, Database db)
{
object result = null;
using (DbCommand cmd = db.GetStoredProcCommand(spName))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
result = db.ExecuteScalar(cmd, pTransaction);
}
return result;
}
///
/// Runs a query on DB with parameters and returns a dbDataReader. must close the reader after done with reader.
///
///
///
///
public DbDataReader GetDBQueryReader(string query, QueryParamList queryParams)
{
Database db = GetSQLDatabase();
DbCommand command = db.GetSqlStringCommand(query);
if (command.Connection == null)
command.Connection = db.CreateConnection();
if (queryParams != null)
{
foreach (QueryParamObj obj in queryParams)
{
db.AddInParameter(command, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
if (command.Connection.State != ConnectionState.Open)
{
command.Connection.Open();
}
DbDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult);
return reader;
}
public List ExecuteDBQuery(string query, QueryParamList queryParams, Func> populateData)
{
Database db = GetSQLDatabase();
DbCommand command = db.GetSqlStringCommand(query);
if (command.Connection == null)
command.Connection = db.CreateConnection();
if (queryParams != null)
{
foreach (QueryParamObj obj in queryParams)
{
db.AddInParameter(command, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
DbDataReader reader = null;
List list = new List();
try
{
if (command.Connection.State != ConnectionState.Open)
{
command.Connection.Open();
}
reader = command.ExecuteReader(CommandBehavior.SingleResult);
list = populateData(reader);
}
catch (Exception e)
{
Logger.LogException(e);
}
finally
{
if (reader != null)
reader.Close();
CloseConnection(command);
}
return list;
}
public List ExecuteDBQuery(string query, QueryParamList queryParams, Func> populateData, string connString)
{
Database db = GetSQLDatabase(connString);
DbCommand command = db.GetSqlStringCommand(query);
if (command.Connection == null)
command.Connection = db.CreateConnection();
if (queryParams != null)
{
foreach (QueryParamObj obj in queryParams)
{
db.AddInParameter(command, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
DbDataReader reader = null;
List list = new List();
try
{
if (command.Connection.State != ConnectionState.Open)
{
command.Connection.Open();
}
reader = command.ExecuteReader(CommandBehavior.SingleResult);
list = populateData(reader);
}
catch (Exception e)
{
Logger.LogException(e);
}
finally
{
if (reader != null)
reader.Close();
CloseConnection(command);
}
return list;
}
public List ExecuteDBQuery(string query, QueryParamList queryParams, Func> populateData, bool addToCache, string cacheKey)
{
Database db = GetSQLDatabase();
DbCommand command = db.GetSqlStringCommand(query);
if (command.Connection == null)
command.Connection = db.CreateConnection();
if (queryParams != null)
{
foreach (QueryParamObj obj in queryParams)
{
db.AddInParameter(command, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
DbDataReader reader = null;
List list = new List();
try
{
if (command.Connection.State != ConnectionState.Open)
{
command.Connection.Open();
}
SqlDependency dependency = null;
if (addToCache)
{
dependency = new SqlDependency(command as SqlCommand);
}
reader = command.ExecuteReader(CommandBehavior.SingleResult);
list = populateData(reader);
if (addToCache)
{
// InMemoryCache.CacheService.Set(cacheKey, list, dependency);
}
}
catch (Exception e)
{
Logger.LogException(e);
}
finally
{
if (reader != null)
reader.Close();
CloseConnection(command);
}
return list;
}
protected List ExecuteStoreProcedure(string storedProcName, QueryParamList spParams, Func> populateData)
{
Database db = GetSQLDatabase();
using (DbCommand cmd = db.GetStoredProcCommand(storedProcName))
{
if (cmd.Connection == null)
cmd.Connection = db.CreateConnection();
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
DbDataReader reader = null;
List list = new List();
try
{
if (cmd.Connection.State != ConnectionState.Open)
{
cmd.Connection.Open();
}
cmd.CommandTimeout = 240;
reader = cmd.ExecuteReader(CommandBehavior.SingleResult);
list = populateData(reader);
}
catch (Exception e)
{
Logger.LogException(e);
}
finally
{
if (reader != null)
reader.Close();
CloseConnection(cmd);
}
return list;
}
}
protected List ExecuteStoreProcedureWithDataTable(string storedProcName, QueryParamList spParams, Func> populateData)
{
var db = (SqlDatabase)GetSQLDatabase();
using (DbCommand cmd = db.GetStoredProcCommand(storedProcName))
{
if (cmd.Connection == null)
cmd.Connection = db.CreateConnection();
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.SqlDbType, obj.ParamValue);
}
}
DbDataReader reader = null;
List list = new List();
try
{
if (cmd.Connection.State != ConnectionState.Open)
{
cmd.Connection.Open();
}
cmd.CommandTimeout = 240;
reader = cmd.ExecuteReader(CommandBehavior.SingleResult);
list = populateData(reader);
}
catch (Exception e)
{
Logger.LogException(e);
}
finally
{
if (reader != null)
reader.Close();
CloseConnection(cmd);
}
return list;
}
}
protected List ExecuteStoreProcedure(string storedProcName, QueryParamList spParams, Func> populateData, string connectionString)
{
Database db = GetSQLDatabase(connectionString);
using (DbCommand cmd = db.GetStoredProcCommand(storedProcName))
{
if (cmd.Connection == null)
cmd.Connection = db.CreateConnection();
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
DbDataReader reader = null;
List list = new List();
try
{
if (cmd.Connection.State != ConnectionState.Open)
{
cmd.Connection.Open();
}
cmd.CommandTimeout = 240;
reader = cmd.ExecuteReader(CommandBehavior.SingleResult);
list = populateData(reader);
}
catch (Exception e)
{
Logger.LogException(e);
}
finally
{
if (reader != null)
reader.Close();
CloseConnection(cmd);
}
return list;
}
}
protected int ExecuteMasterDetails(string query, IEnumerable spParams, Database db, DbTransaction transaction)
{
var rValue = 0;
using (DbCommand cmd = db.GetSqlStringCommand(query))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
try
{
rValue = db.ExecuteNonQuery(cmd, transaction);
}
catch (Exception ex)
{
rValue = -1;
transaction.Rollback();
CloseConnection(cmd);
}
}
return rValue;
}
protected void CloseConnection(DbCommand command)
{
if (command != null && command.Connection.State == ConnectionState.Open)
{
command.Connection.Close();
}
}
public DataSet GetData(string tableName, QueryParamList pParams, ref string pErrString)
{
string query = "SELECT * FROM " + tableName;
AddWhereClause(ref query, pParams);
return LoadDataSet(query, pParams, tableName, ref pErrString);
}
protected int ExecuteInsideTransaction(string query, IEnumerable spParams, Database db, DbTransaction transaction)
{
var rValue = 0;
using (DbCommand cmd = db.GetSqlStringCommand(query))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
try
{
rValue = db.ExecuteNonQuery(cmd, transaction);
}
catch (Exception ex)
{
Logger.LogException(ex);
rValue = -1;
transaction.Rollback();
CloseConnection(cmd);
}
}
return rValue;
}
protected int ExecuteSPInsideTransaction(string spName, IEnumerable spParams, Database db, DbTransaction transaction)
{
var rValue = 0;
using (DbCommand cmd = db.GetStoredProcCommand(spName))
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
db.AddInParameter(cmd, obj.ParamName, obj.DBType, obj.ParamValue);
}
}
try
{
db.ExecuteNonQuery(cmd, transaction);
}
catch (Exception ex)
{
Logger.LogException(ex);
rValue = -1;
transaction.Rollback();
CloseConnection(cmd);
}
finally
{
if (spParams != null)
{
foreach (QueryParamObj obj in spParams)
{
obj.ParamValue = db.GetParameterValue(cmd, obj.ParamName);
}
}
}
}
return rValue;
}
}
}