using System; using System.Data; using System.Data.OracleClient; using System.Data.Common; using System.Collections.Generic; using Microsoft.Practices.EnterpriseLibrary.Data; using Microsoft.Practices.EnterpriseLibrary.Data.Oracle; using Microsoft.Practices.EnterpriseLibrary.Data.Sql; using System.Data.SqlClient; using NLog; using DataAccessLayer; using System.Globalization; using System.Linq; using System.Collections.Concurrent; using System.Configuration; using System.Threading; namespace DataAccessLayer { public class DataAccess { public static DataTable ExecuteDataTableStoredProcedure(DBProvider _dbprovider, string nomeStoredProcedure, List paramList) { Database db = GetDatabaseObject(_dbprovider); DbCommand comm = db.GetStoredProcCommand(nomeStoredProcedure); if (paramList != null) { foreach (Parametro param in paramList) { db.AddParameter(comm, param.ParameterName, param.DbType, param.Direction, param.SourceColumn, param.SourceVersion, param.Value); } } try { SqlLogging.LogStoredProcedureStart(nomeStoredProcedure, paramList); var result = db.ExecuteDataSet(comm).Tables[0]; SqlLogging.LogStoredProcedureSuccess(nomeStoredProcedure, result.Rows.Count); return result; } catch (Exception ex) { SqlLogging.LogStoredProcedureError(nomeStoredProcedure, ex, paramList); DataBaseException ecc = new DataBaseException(ex, db.ConnectionStringWithoutCredentials, nomeStoredProcedure, paramList); throw ecc; } } private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); public static IDataReader ExecuteDataReaderStoredProcedure(DBProvider _dbprovider, string nomeStoredProcedure, List paramList) { // The DataTable to be ret urned Database db = GetDatabaseObject(_dbprovider); // Execute the command making sure the connection gets closed in the end DbCommand comm = db.GetStoredProcCommand(nomeStoredProcedure); comm.CommandTimeout = 120; if (paramList != null) { foreach (Parametro param in paramList) { db.AddParameter(comm, param.ParameterName, param.DbType, param.Direction, param.SourceColumn, param.SourceVersion, param.Value); } } try { // Execute the command making sure the connection gets closed in the end return db.ExecuteReader(comm); } catch (Exception ex) { //logger.Error(db.ConnectionStringWithoutCredentials); //logger.Error(nomeStoredProcedure); DataBaseException ecc = new DataBaseException(ex, db.ConnectionStringWithoutCredentials, nomeStoredProcedure, paramList); SqlLogging.LogErrors(ex); throw ecc; } } public static object ExecuteScalarStoredProcedure(DBProvider _dbprovider, string nomeStoredProcedure, List paramList) { // The DataTable to be ret urned Database db = GetDatabaseObject(_dbprovider); // Execute the command making sure the connection gets closed in the end DbCommand comm = db.GetStoredProcCommand(nomeStoredProcedure); if (paramList != null) { foreach (Parametro param in paramList) { db.AddParameter(comm, param.ParameterName, param.DbType, param.Direction, param.SourceColumn, param.SourceVersion, param.Value); } } try { // Execute the command making sure the connection gets closed in the end return db.ExecuteScalar(comm); } catch (Exception ex) { DataBaseException ecc = new DataBaseException(ex, db.ConnectionStringWithoutCredentials, nomeStoredProcedure, paramList); SqlLogging.LogErrors(ex); throw ecc; } } public static int ExecuteNonQueryStoredProcedure(DBProvider _dbprovider, string nomeStoredProcedure, List paramList) { // The DataTable to be ret urned Database db = GetDatabaseObject(_dbprovider); int ritorno = -1; using (DbConnection connection = db.CreateConnection()) { connection.Open(); DbTransaction transaction = connection.BeginTransaction(IsolationLevel.Serializable); try { // Execute the command making sure the connection gets closed in the end DbCommand comm = db.GetStoredProcCommand(nomeStoredProcedure); if (paramList != null) { foreach (Parametro param in paramList) { db.AddParameter(comm, param.ParameterName, param.DbType, param.Direction, param.SourceColumn, param.SourceVersion, param.Value); } } Parametro returnParam = null; if (_dbprovider != DBProvider.Oracle) { returnParam = new Parametro(); returnParam.ParameterName = "RETURN"; returnParam.DbType = DbType.Int32; returnParam.Direction = ParameterDirection.ReturnValue; returnParam.Value = -1; db.AddParameter(comm, returnParam.ParameterName, returnParam.DbType, returnParam.Direction, returnParam.SourceColumn, returnParam.SourceVersion, returnParam.Value); } ritorno = db.ExecuteNonQuery(comm, transaction); if (_dbprovider != DBProvider.Oracle) ritorno = (Int32)comm.Parameters["@RETURN"].Value; transaction.Commit(); return ritorno; } catch (DataBaseException ex) { transaction.Rollback(); SqlLogging.LogErrors(ex); //throw new DataBaseException(ex, db.ConnectionStringWithoutCredentials, nomeStoredProcedure, paramList); return ritorno; } } } private static Database GetDatabaseObject(DBProvider _dbprovider) { // The DataTable to be ret urned Database db = null; string connstring; if (_dbprovider == DBProvider.SqlServer) { connstring = WebConfigParameter.getConnectionString("SqlServerConnection"); db = new SqlDatabase(connstring); } else if (_dbprovider == DBProvider.SqlServerStampeC6) { connstring = WebConfigParameter.getConnectionString("SqlServerStampeC6Connection"); db = new SqlDatabase(connstring); } else if (_dbprovider == DBProvider.SqlServerConsulenzaBase) { connstring = WebConfigParameter.getConnectionString("SqlServerConnectionConsulenzaBase"); db = new SqlDatabase(connstring); } else if (_dbprovider == DBProvider.SqlServerConsulenzaUnica) { connstring = WebConfigParameter.getConnectionString("SqlServerConsulenzaUnicaConnection"); db = new SqlDatabase(connstring); } else if (_dbprovider == DBProvider.SqlServerConsulenzaEvoluta) { connstring = WebConfigParameter.getConnectionString("SqlServerConsulenzaEvolutaConnection"); db = new SqlDatabase(connstring); } else if (_dbprovider == DBProvider.SqlServerCatalogoProdotti) { connstring = WebConfigParameter.getConnectionString("SqlServerCatalogoProdottiConnection"); db = new SqlDatabase(connstring); } else if (_dbprovider == DBProvider.SqlServerReportModeler) { connstring = WebConfigParameter.getConnectionString("SqlServerConnectionReportModeler"); db = new SqlDatabase(connstring); } else if (_dbprovider == DBProvider.SqlServerWebTemplateReportModeler) { connstring = WebConfigParameter.getConnectionString("SqlServerConnectionWebTemplateReportModeler"); db = new SqlDatabase(connstring); } else if (_dbprovider == DBProvider.SqlServerReportArchive) { connstring = WebConfigParameter.getConnectionString("SqlServerConnectionReportArchive"); db = new SqlDatabase(connstring); } else if (_dbprovider == DBProvider.Oracle) { connstring = WebConfigParameter.getConnectionString("OracleConnection"); db = new OracleDatabase(connstring); } return db; } } public class DataAccessDE : IDisposable { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private static ConcurrentDictionary preCalculatedProcedureTables = new ConcurrentDictionary(); private static string[] mergedProcedures = new string[] { "c6martperiodico.pl_d2_s169rischiomercatorischiocredito", "c6martperiodico.pl_d2_s170rischiodiversificazione" }; public DBProvider Provider { get; private set; } public DataAccessDE(DBProvider provider) { //logger.Traces("DE1_CA="+System.Reflection.Assembly.GetCallingAssembly().GetName().Name+"_EA="+System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);//=2= Provider = provider; } public void Dispose(){ } public IDataReader ExecuteDataReaderStoredProcedure(DBProvider _dbprovider, string nomeStoredProcedure, List paramList) { IDataReader reader; List parameters = new List(); if (paramList != null) { foreach (Parametro p in paramList) { parameters.Add(new SqlParameter(p.ParameterName, p.Value)); } } try { var vConn = SQLServer.GetConnection6(); //using (SqlConnection vConn = new SqlConnection(GetConnectionString(Provider))) //{ // vConn.Open(); using (SqlCommand cmd = new SqlCommand()) { cmd.CommandTimeout = CACHE.CommandTimeout; cmd.Connection = vConn; cmd.Parameters.AddRange(parameters.ToArray()); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = nomeStoredProcedure; cmd.CommandText = ConvertProcedureToTableStatement(paramList, nomeStoredProcedure); reader = cmd.ExecuteReader(); cmd.Parameters.Clear(); } //vConn.Close(); return reader; //} } catch (Exception ex) { } return null; } private string ConvertProcedureToTableStatement(List listaParametri, string storedProcedure) { return "wh.p_" + storedProcedure.Substring(storedProcedure.IndexOf('.') + 1, storedProcedure.Length - storedProcedure.IndexOf('.') - 1).ToLower().Replace("[", "").Replace("]", ""); } } public enum DBProvider : int { Oracle, SqlServer, SqlServerStampeC6, /// /// E' la stringa di connessione al database Sql Server di ReportModeler (Configuratore dei report per il progetto Consulenza). /// SqlServerReportModeler, /// /// E' la stringa di connessione al database Sql Server di Consulenza Base. /// SqlServerConsulenzaBase, /// /// E' la stringa di connessione al database Sql Server di Consulenza Base. /// SqlServerConsulenzaEvoluta, /// /// E' la stringa di connessione al database Sql Server di Catalogo Prodotti. /// SqlServerCatalogoProdotti, /// /// Stringa di connessione al database Sql Server che gestisce la modellazione lato web dei template dei report. /// SqlServerWebTemplateReportModeler, /// /// Stringa di connessione al database di archiviazione dei report. /// SqlServerReportArchive, /// /// E' la stringa di connessione al database Sql Server di ConsulenzaUnica. /// SqlServerConsulenzaUnica } } public class Parametro : DbParameter { public Parametro() { _sourceversion = DataRowVersion.Current; _paramdirection = ParameterDirection.Input; } DbType _dbtype; public override DbType DbType { get { return _dbtype; } set { _dbtype = value; } } ParameterDirection _paramdirection; public override ParameterDirection Direction { get { return _paramdirection; } set { _paramdirection = value; } } bool _nullable; public override bool IsNullable { get { return _nullable; } set { _nullable = value; } } string _paramName; public override string ParameterName { get { return _paramName; } set { _paramName = value; } } public override void ResetDbType() { throw new Exception("The method or operation is not implemented."); } int _size; public override int Size { get { return _size; } set { _size = value; } } string _sourceColumn; public override string SourceColumn { get { return _sourceColumn; } set { _sourceColumn = value; } } bool _sourcecolumnnullmapping; public override bool SourceColumnNullMapping { get { return _sourcecolumnnullmapping; } set { _sourcecolumnnullmapping = value; } } DataRowVersion _sourceversion; public override DataRowVersion SourceVersion { get { return _sourceversion; } set { _sourceversion = value; } } object _value; public override object Value { get { return _value; } set { _value = value; } } } public class TransactionStatement { private string _sqlstatement; private CommandType _statementtype; private List _paramlist; public TransactionStatement() { _sqlstatement = ""; _paramlist = new List(); _statementtype = CommandType.Text; } public List ListaParametro { get { return _paramlist; } } public string SqlStatement { get { return _sqlstatement; } set { _sqlstatement = value; } } public void addParametroToList(Parametro _parametro) { _paramlist.Add(_parametro); } public CommandType StatementType { get { return _statementtype; } set { _statementtype = value; } } }