2025-04-15 12:10:19 +02:00

687 lines
28 KiB
C#

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.OracleClient;
using System.Data.Common;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Oracle;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using System.Collections.Concurrent;
using System.Configuration;
namespace DataAccessLayer
{
public class DataAccessDE : IDisposable
{
private static ConcurrentDictionary<string, bool> preCalculatedProcedureTables = new ConcurrentDictionary<string, bool>();
//c6martperiodico.gestione_s_intermediari - select only
//c6martperiodico.pl_d2_s150anagrafica - select only
//c6martperiodico.pl_d2_s166contocorrenteai - select only
//c6martperiodico.pl_mp_s132profilorischioadeguatezza - select only
//c6martperiodico.pl_mp_s137bis_foi80 - select only
//c6martperiodico.pl_mp_s149dettaglioprodottiaffluent - select only
//c6martperiodico.pl_s25anagrafica - select only
//c6martperiodico.pl_s80bisevoluzionerischio - select only
//c6martperiodico.pl_d_s331areebisogno - proc missing on C6StampeCentralizzate
//c6martperiodico.pl_d_s332fvi_cs80_ct80 - proc missing on C6StampeCentralizzate
//c6martperiodico.pl_d_s333fonditalia80 - proc missing on C6StampeCentralizzate
private static string[] mergedProcedures = new string[] {
//"c6martperiodico.pl_s43lineaselfbf",
//"c6martperiodico.pl_s10patrimoniofinanziario",
//"c6martperiodico.pl_prodotti_non_associati_area_inv",
//"c6martperiodico.pl_d2_s151profilodirischio",
//"c6martperiodico.pl_d2_s152patrimonio",
//"c6martperiodico.pl_d2_s153patrimoniofinanziario",
//"c6martperiodico.pl_d2_s154patrimoniofinanziario",
//"c6martperiodico.pl_d2_s155patrimonioimmobiliare",
//"c6martperiodico.pl_d2_s156altropatrimonio",
//"c6martperiodico.pl_d2_s157confrontopiramidi",
//"c6martperiodico.pl_d2_s158piramidemodello",
//"c6martperiodico.pl_d2_s159patrimoniofinanziario",
//"c6martperiodico.pl_d2_s160dettaglioprodottibf",
//"c6martperiodico.pl_d2_s162dettaglioprodotti",
//"c6martperiodico.pl_d2_s163patrimoniofinanziariomassetclass",
//"c6martperiodico.pl_d2_s164polizzealtriistituti",
//"c6martperiodico.pl_d2_s165fondialtriistituti",
//"c6martperiodico.pl_d2_s167distribuzionerischiocredito",
//"c6martperiodico.pl_d2_s168tabellaemittenti",
//"c6martperiodico.pl_s43dettaglioprodottibf",
//"c6martperiodico.pl_d2_s169rischiomercatorischiocredito",
//"c6martperiodico.pl_d2_s170rischiodiversificazione",
//"c6martperiodico.pl_d2_s171patrimoniononrappresentabileassettclass",
//"c6martperiodico.pl_areemonitorate",
//"c6martperiodico.pl_mp_s137bonus",
//"c6martperiodico.pl_mp_s135monitoraggioinvestimento",
//"c6martperiodico.pl_mp_s134monitoraggioliquidita",
//"c6martperiodico.pl_mp_s134bismonitoraggioliqinv",
//"c6martperiodico.pl_mp_s133bisprincipaliprodotti",
//"c6martperiodico.pl_mp_s133areebisognoprincprod",
//"c6martperiodico.pl_mp_s146rischiodiversificazione",
//"c6martperiodico.pl_mp_s141analisirisparmiotable",
//"c6martperiodico.pl_mp_s140analisirisparmiocharts",
//"c6martperiodico.pl_mp_s137biscapitaleprotetto",
//"c6martperiodico.pl_s43contocorrentebf",
//"c6martperiodico.pl_s43bisdettaglioprodottibf",
//"c6martperiodico.pl_s88patrimoniononconsideratonelcalcolodelrendimento",
//"c6martperiodico.pl_s85rendimentoportafogliocono",
//"c6martperiodico.pl_s82datisintetici",
//"c6martperiodico.pl_s82bisdatisintetici",
//"c6martperiodico.pl_s76alternativapatrimoniononrappresentabileassettclass",
//"c6martperiodico.pl_s80alternativa",
//"c6martperiodico.pl_s96rischiomercatorischiocredito",
//"c6martperiodico.pl_d_s170rischiodiversificazione"
"c6martperiodico.pl_d2_s169rischiomercatorischiocredito",
"c6martperiodico.pl_d2_s170rischiodiversificazione"
};
private static int commandTimeout
{
get
{
try
{
return Int32.Parse(ConfigurationManager.AppSettings["sqlCommandTimeout"]);
}
catch
{
return 200;
}
}
}
private bool CanTakeDataFromPreCalculatedTables(string storedProcedure, List<Parametro> paramList)
{
//int usePrecalculatedTablesParam = int.Parse(ConfigurationManager.AppSettings["usePrefilledTables"]);
bool usePrecalculatedTablesParam = bool.Parse(ConfigurationManager.AppSettings["usePrefilledTables"]);
string procedureName = storedProcedure.ToLower().Replace("[", "").Replace("]", "");
//if (paramList == null || usePrecalculatedTablesParam == 0 ||
if (paramList == null || !usePrecalculatedTablesParam ||
!(paramList.Where(x => x.ParameterName.ToLower().Equals("rete") || x.ParameterName.ToLower().Equals("codicefiscale")).Count() == 2 ||
paramList.Where(x => x.ParameterName.ToLower().Equals("rete") || x.ParameterName.ToLower().Equals("codicecliente")).Count() == 2) ||
!mergedProcedures.Contains(procedureName)
)
{
return false;
}
string tableName = "wh." + storedProcedure.Substring(storedProcedure.IndexOf('.') + 1, storedProcedure.Length - storedProcedure.IndexOf('.') - 1).ToLower().Replace("[", "").Replace("]", "");
if (!preCalculatedProcedureTables.ContainsKey(tableName))
{
string checkTableExistanceStatement = "IF object_id('" + tableName + "') is not null select 2 ELSE select 1";
int tableExistanceResult = (int)ExecuteScalar(DBProvider.SqlServerStampeC6, CommandType.Text, checkTableExistanceStatement);
if (tableExistanceResult == 2)
{
preCalculatedProcedureTables.TryAdd(tableName, true);
}
else
{
preCalculatedProcedureTables.TryAdd(tableName, false);
}
}
bool value = false;
preCalculatedProcedureTables.TryGetValue(tableName, out value);
bool result = true;
if (!value)
{
result = false;
}
return result;
}
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public DBProvider Provider { get; private set; }
private SqlConnection _connection { get; set; }
private SqlConnection ConnectionBackup
{
get
{
SqlConnection con = new SqlConnection(GetConnectionString(Provider));
con.Open();
return con;
}
}
public SqlConnection Connection
{
get
{
if (_connection == null)
{
_connection = new SqlConnection(GetConnectionString(Provider));
}
int i = 0;
string err = String.Empty;
while (_connection.State != ConnectionState.Open)
{
try
{
_connection.Open();
}
catch (Exception ex)
{
i++;
err = (ex.Message);
}
if (i > 6)
{
logger.Error(err);
break;
}
}
return _connection;
}
}
public DataAccessDE(DBProvider provider)
{
Provider = provider;
}
public void Dispose()
{
if (_connection != null) { if ( _connection.State == ConnectionState.Open)
{
_connection.Close();
}
_connection.Dispose();
}
}
public IDataReader ExecuteDataReader(CommandType _commandType, string _commandText, out SqlCommand _command)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = commandTimeout;
IDataReader reader;
_command = cmd;
try
{
cmd.Connection = Connection;
cmd.CommandText = _commandText;
cmd.CommandType = _commandType;
reader = cmd.ExecuteReader();
cmd.Parameters.Clear();
return reader;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(_commandText, ":", ex.Message));
}
catch { }
if (cmd != null)
cmd.Dispose();
}
return null;
}
public DataTable ExecuteDataTable(CommandType _commandType, string _commandText)
{
DataTable result = null;
try
{
using (SqlCommand cmd = Connection.CreateCommand())
{
cmd.CommandTimeout = commandTimeout;
cmd.CommandType = _commandType;
cmd.CommandText = _commandText;
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(result);
}
cmd.Parameters.Clear();
}
return result;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(_commandText, ":", ex.Message));
}
catch { }
result = null;
}
return null;
}
public object ExecuteScalar(DBProvider _dbprovider, CommandType _commandType, string _commandText)
{
object result = null;
SqlTransaction tran = Connection.BeginTransaction();
try
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandTimeout = commandTimeout;
cmd.Transaction = tran;
cmd.CommandText = _commandText;
cmd.Connection = Connection;
cmd.CommandType = _commandType;
result = cmd.ExecuteScalar();
cmd.Parameters.Clear();
}
tran.Commit();
return result;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(_commandText, ":", ex.Message));
}
catch { }
tran.Rollback();
}
return null;
}
public object ExecuteNonQuery(CommandType _commandType, string _commandText)
{
object result = null;
SqlTransaction tran = Connection.BeginTransaction();
try
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandTimeout = commandTimeout;
cmd.Transaction = tran;
cmd.CommandText = _commandText;
cmd.Connection = Connection;
cmd.CommandType = _commandType;
result = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
tran.Commit();
return result;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(_commandText, ":", ex.Message));
}
catch { }
tran.Rollback();
}
return null;
}
public IDataReader ExecuteDataReader(CommandType _commandType, string _commandText, DbParameter[] _commandParameters, out SqlCommand _command)
{
SqlCommand cmd = new SqlCommand();
IDataReader reader;
_command = cmd;
try
{
cmd.CommandTimeout = commandTimeout;
cmd.Connection = Connection;
cmd.CommandText = _commandText;
cmd.CommandType = _commandType;
cmd.Parameters.AddRange(_commandParameters);
reader = cmd.ExecuteReader();
cmd.Parameters.Clear();
return reader;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(_commandText, ":", ex.Message, paramsToString(_commandParameters)));
}
catch { }
if (cmd != null)
cmd.Dispose();
}
return null;
}
public DataTable ExecuteDataTable(CommandType _commandType, string _commandText, DbParameter[] _commandParameters)
{
DataTable result = new DataTable();
try
{
using (SqlCommand cmd = Connection.CreateCommand())
{
cmd.CommandTimeout = commandTimeout;
cmd.CommandType = _commandType;
cmd.CommandText = _commandText;
cmd.Parameters.AddRange(_commandParameters);
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(result);
}
cmd.Parameters.Clear();
}
return result;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(_commandText, ":", ex.Message, paramsToString(_commandParameters)));
}
catch { }
result = null;
}
return null;
}
public object ExecuteScalar(CommandType _commandType, string _commandText, DbParameter[] _commandParameters)
{
object result = null;
SqlTransaction tran = Connection.BeginTransaction();
try
{
using (SqlCommand cmd = Connection.CreateCommand())
{
cmd.CommandTimeout = commandTimeout;
cmd.Transaction = tran;
cmd.CommandText = _commandText;
cmd.Connection = Connection;
cmd.CommandType = _commandType;
cmd.Parameters.AddRange(_commandParameters);
result = cmd.ExecuteScalar();
cmd.Parameters.Clear();
}
tran.Commit();
return result;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(_commandText, ":", ex.Message, paramsToString(_commandParameters)));
}
catch { }
tran.Rollback();
}
return null;
}
public object ExecuteNonQuery(CommandType _commandType, string _commandText, DbParameter[] _commandParameters)
{
object result = null;
SqlTransaction tran = Connection.BeginTransaction();
try
{
using (SqlCommand cmd = Connection.CreateCommand())
{
cmd.CommandTimeout = commandTimeout;
cmd.CommandTimeout = 9000000;
cmd.Transaction = tran;
cmd.CommandText = _commandText;
cmd.Connection = Connection;
cmd.CommandType = _commandType;
cmd.Parameters.AddRange(_commandParameters);
result = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
tran.Commit();
return result;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(_commandText, ":", ex.Message, paramsToString(_commandParameters)));
}
catch { }
tran.Rollback();
}
return null;
}
public DataTable ExecuteDataTableSqlStatement(DBProvider _dbprovider, string sqlText, List<Parametro> paramList)
{
List<SqlParameter> parameters = new List<SqlParameter>();
if (paramList != null)
{
foreach (Parametro p in paramList)
{
parameters.Add(new SqlParameter(p.ParameterName, p.Value));
}
}
DataTable result = new DataTable();
try
{
using (SqlCommand cmd = Connection.CreateCommand())
{
cmd.CommandTimeout = commandTimeout;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sqlText;
cmd.Parameters.AddRange(parameters.ToArray());
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(result);
}
cmd.Parameters.Clear();
}
return result;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(sqlText, ":", ex.Message, paramsToString(parameters.ToArray())));
}
catch { }
result = null;
}
return null;
}
public DataTable ExecuteDataTableStoredProcedure(DBProvider _dbprovider, string nomeStoredProcedure, List<Parametro> paramList)
{
List<SqlParameter> parameters = new List<SqlParameter>();
if (paramList != null)
{
foreach (Parametro p in paramList)
{
parameters.Add(new SqlParameter(p.ParameterName, p.Value));
}
}
DataTable result = new DataTable();
try
{
using (SqlCommand cmd = Connection.CreateCommand())
{
cmd.CommandTimeout = commandTimeout;
cmd.Parameters.AddRange(parameters.ToArray());
cmd.CommandType = CommandType.StoredProcedure;
if (!CanTakeDataFromPreCalculatedTables(nomeStoredProcedure, paramList))
{
cmd.CommandText = nomeStoredProcedure;
}
else
{
cmd.CommandText = ConvertProcedureToTableStatement(paramList, nomeStoredProcedure);
}
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(result);
}
cmd.Parameters.Clear();
}
return result;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(nomeStoredProcedure, ":", ex.Message, paramsToString(parameters.ToArray())));
}
catch { }
result = null;
}
return null;
}
public object ExecuteScalarStoredProcedure(DBProvider _dbprovider, string nomeStoredProcedure, List<Parametro> paramList)
{
object result = null;
List<SqlParameter> parameters = new List<SqlParameter>();
if (paramList != null)
{
foreach (Parametro p in paramList)
{
parameters.Add(new SqlParameter(p.ParameterName, p.Value));
}
}
try
{
using (SqlCommand cmd = Connection.CreateCommand())
{
cmd.CommandTimeout = commandTimeout;
cmd.Connection = Connection;
cmd.Parameters.AddRange(parameters.ToArray());
cmd.CommandType = CommandType.StoredProcedure;
if (!CanTakeDataFromPreCalculatedTables(nomeStoredProcedure, paramList))
{
cmd.CommandText = nomeStoredProcedure;
}
else
{
cmd.CommandText = ConvertProcedureToTableStatement(paramList, nomeStoredProcedure);
}
result = cmd.ExecuteScalar();
cmd.Parameters.Clear();
}
return result;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(nomeStoredProcedure, ":", ex.Message, paramsToString(parameters.ToArray())));
}
catch { }
}
return null;
}
public IDataReader ExecuteDataReaderStoredProcedure(DBProvider _dbprovider, string nomeStoredProcedure, List<Parametro> paramList)
{
SqlCommand cmd = new SqlCommand();
IDataReader reader;
List<SqlParameter> parameters = new List<SqlParameter>();
if (paramList != null)
{
foreach (Parametro p in paramList)
{
parameters.Add(new SqlParameter(p.ParameterName, p.Value));
}
}
try
{
cmd.CommandTimeout = commandTimeout;
cmd.Connection = Connection;
cmd.Parameters.AddRange(parameters.ToArray());
cmd.CommandType = CommandType.StoredProcedure;
if (!CanTakeDataFromPreCalculatedTables(nomeStoredProcedure, paramList))
{
cmd.CommandText = nomeStoredProcedure;
}
else
{
cmd.CommandText = ConvertProcedureToTableStatement(paramList, nomeStoredProcedure);
}
reader = cmd.ExecuteReader();
cmd.Parameters.Clear();
return reader;
}
catch (Exception ex)
{
try {
logger.Error(String.Concat(nomeStoredProcedure, ":", ex.Message, paramsToString(parameters.ToArray())));
}
catch { }
if (cmd != null)
cmd.Dispose();
}
return null;
}
public int ExecuteNonQueryStoredProcedureRoot(SqlConnection _myConnection, DBProvider _dbprovider, string nomeStoredProcedure, List<Parametro> paramList)
{
SqlCommand cmd = new SqlCommand();
List<SqlParameter> parameters = new List<SqlParameter>();
int result = 0;
if (paramList != null)
{
foreach (Parametro p in paramList)
{
parameters.Add(new SqlParameter(p.ParameterName, p.Value));
}
}
try
{
cmd.CommandTimeout = commandTimeout;
cmd.Connection = _myConnection;
cmd.CommandType = CommandType.StoredProcedure;
if (!CanTakeDataFromPreCalculatedTables(nomeStoredProcedure, paramList))
{
cmd.CommandText = nomeStoredProcedure;
}
else
{
cmd.CommandText = ConvertProcedureToTableStatement(paramList, nomeStoredProcedure);
}
if(parameters.Count()>0)
cmd.Parameters.AddRange(parameters.ToArray());
result = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
catch (Exception ex)
{
try
{
logger.Error(String.Concat(nomeStoredProcedure, ":", ex.Message, paramsToString(parameters.ToArray())));
}
catch { }
if (cmd != null)
cmd.Dispose();
}
return result;
}
public int ExecuteNonQueryStoredProcedure(DBProvider _dbprovider, string nomeStoredProcedure, List<Parametro> paramList)
{
return ExecuteNonQueryStoredProcedureRoot(Connection, _dbprovider, nomeStoredProcedure, paramList);
}
public int ExecuteNonQueryStoredProcedureBackupConnection(DBProvider _dbprovider, string nomeStoredProcedure, List<Parametro> paramList)
{
return ExecuteNonQueryStoredProcedureRoot(ConnectionBackup, _dbprovider, nomeStoredProcedure, paramList);
}
private string paramsToString(DbParameter[] par)
{
string res = String.Empty;
foreach (var p in par)
{
res += String.Concat(p.ParameterName, ":", p.Value, ";");
}
return res;
}
private static string GetConnectionString(DBProvider _dbprovider)
{
switch (_dbprovider)
{
case DBProvider.SqlServer:
return WebConfigParameter.getConnectionString("SqlServerConnection");
case DBProvider.SqlServerStampeC6:
return WebConfigParameter.getConnectionString("SqlServerStampeC6Connection");
case DBProvider.SqlServerConsulenzaBase:
return WebConfigParameter.getConnectionString("SqlServerConnectionConsulenzaBase");
case DBProvider.SqlServerConsulenzaUnica:
return WebConfigParameter.getConnectionString("SqlServerConsulenzaUnicaConnection");
case DBProvider.SqlServerConsulenzaEvoluta:
return WebConfigParameter.getConnectionString("SqlServerConsulenzaEvolutaConnection");
case DBProvider.SqlServerCatalogoProdotti:
return WebConfigParameter.getConnectionString("SqlServerCatalogoProdottiConnection");
case DBProvider.SqlServerReportModeler:
return WebConfigParameter.getConnectionString("SqlServerConnectionReportModeler");
case DBProvider.SqlServerWebTemplateReportModeler:
return WebConfigParameter.getConnectionString("SqlServerConnectionWebTemplateReportModeler");
case DBProvider.SqlServerReportArchive:
return WebConfigParameter.getConnectionString("SqlServerConnectionReportArchive");
case DBProvider.Oracle:
return WebConfigParameter.getConnectionString("OracleConnection");
default:
return "";
}
}
private string ConvertProcedureToTableStatement(List<Parametro> listaParametri, string storedProcedure)
{
return "wh.p_" + storedProcedure.Substring(storedProcedure.IndexOf('.') + 1, storedProcedure.Length - storedProcedure.IndexOf('.') - 1).ToLower().Replace("[", "").Replace("]", "");
}
}
}