public static InformixProviderAdapter GetInstance(string name) { if (name == ProviderName.Informix) { if (_ifxAdapter == null) { lock (_ifxSyncRoot) if (_ifxAdapter == null) { _ifxAdapter = CreateIfxAdapter(); } } return(_ifxAdapter); } else { if (_db2Adapter == null) { lock (_db2SyncRoot) if (_db2Adapter == null) { _db2Adapter = new InformixProviderAdapter(DB2ProviderAdapter.GetInstance()); } } return(_db2Adapter); } }
private InformixProviderAdapter(DB2ProviderAdapter db2Adapter) { ConnectionType = db2Adapter.ConnectionType; DataReaderType = db2Adapter.DataReaderType; ParameterType = db2Adapter.ParameterType; CommandType = db2Adapter.CommandType; TransactionType = db2Adapter.TransactionType; MappingSchema = db2Adapter.MappingSchema; IsIDSProvider = true; SetDB2Type = db2Adapter.SetDbType; GetDB2Type = db2Adapter.GetDbType; BlobType = db2Adapter.DB2BlobType; ClobType = db2Adapter.DB2ClobType; // DB2Decimal type is unusable with Informix, as provider returns double value // and DB2Decimal(double) constructor is not implemented DecimalType = null; DateTimeType = db2Adapter.DB2DateTimeType; TimeSpanType = db2Adapter.DB2TimeSpanType; TimeSpanFactory = null; DB2BulkCopy = db2Adapter.BulkCopy; GetDecimalReaderMethod = null; GetDateTimeReaderMethod = "GetDB2DateTime"; GetTimeSpanReaderMethod = "GetDB2TimeSpan"; GetBigIntReaderMethod = null; ProviderTypesNamespace = db2Adapter.ProviderTypesNamespace; }
internal static IDataProvider?ProviderDetector(IConnectionStringSettings css, string connectionString) { if (css.ProviderName == ProviderName.Firebird || css.ProviderName == FirebirdProviderAdapter.ClientNamespace || css.Name.Contains("Firebird")) { return(_firebirdDataProvider.Value); } if (css.ProviderName?.Contains("SqlCe") == true || css.ProviderName?.Contains("SqlServerCe") == true || css.Name.Contains("SqlCe") || css.Name.Contains("SqlServerCe")) { return(_sqlCeDataProvider.Value); } switch (css.ProviderName) { case "": case null: case DB2ProviderAdapter.NetFxClientNamespace: case DB2ProviderAdapter.CoreClientNamespace: // this check used by both Informix and DB2 providers to avoid conflicts if (css.Name.Contains("Informix")) { #if NETFRAMEWORK return(_informixDataProvider.Value); #else return(_informixDB2DataProvider.Value); #endif } break; case ProviderName.Informix: if (css.Name.Contains("DB2")) { return(_informixDB2DataProvider.Value); } #if NETFRAMEWORK return(_informixDataProvider.Value); #else return(_informixDB2DataProvider.Value); #endif case ProviderName.InformixDB2: return(_informixDB2DataProvider.Value); #if NETFRAMEWORK case InformixProviderAdapter.IfxClientNamespace: return(_informixDataProvider.Value); #endif } if (connectionString.IndexOf("HDBODBC", StringComparison.InvariantCultureIgnoreCase) >= 0) { return(_hanaOdbcDataProvider.Value); } switch (css.ProviderName) { #if NETFRAMEWORK || NETCOREAPP case SapHanaProviderAdapter.ClientNamespace: case "Sap.Data.Hana.v4.5": case "Sap.Data.Hana.Core": case "Sap.Data.Hana.Core.v2.1": case ProviderName.SapHanaNative: return(_hanaDataProvider.Value); #endif case ProviderName.SapHanaOdbc: return(_hanaOdbcDataProvider.Value); case "": case null: if (css.Name.Contains("Hana")) { goto case ProviderName.SapHana; } break; case ProviderName.SapHana: if (css.Name.IndexOf("ODBC", StringComparison.InvariantCultureIgnoreCase) >= 0) { return(_hanaOdbcDataProvider.Value); } return(GetDataProvider_SapHana()); } switch (css.ProviderName) { case ProviderName.PostgreSQL92: return(_postgreSQLDataProvider92.Value); case ProviderName.PostgreSQL93: return(_postgreSQLDataProvider93.Value); case ProviderName.PostgreSQL95: return(_postgreSQLDataProvider95.Value); case "": case null: if (css.Name == "PostgreSQL") { goto case "Npgsql"; } break; case NpgsqlProviderAdapter.ClientNamespace: case var providerName when providerName.Contains("PostgreSQL") || providerName.Contains(NpgsqlProviderAdapter.AssemblyName): if (css.Name.Contains("92") || css.Name.Contains("9.2")) return(_postgreSQLDataProvider92.Value); if (css.Name.Contains("93") || css.Name.Contains("9.3") || css.Name.Contains("94") || css.Name.Contains("9.4")) return(_postgreSQLDataProvider93.Value); if (css.Name.Contains("95") || css.Name.Contains("9.5") || css.Name.Contains("96") || css.Name.Contains("9.6")) return(_postgreSQLDataProvider95.Value); if (AutoDetectProvider) { try { var cs = string.IsNullOrWhiteSpace(connectionString) ? css.ConnectionString : connectionString; using (var conn = NpgsqlProviderAdapter.GetInstance().CreateConnection(cs)) { conn.Open(); var postgreSqlVersion = conn.PostgreSqlVersion; if (postgreSqlVersion.Major > 9 || postgreSqlVersion.Major == 9 && postgreSqlVersion.Minor > 4) { return(_postgreSQLDataProvider95.Value); } if (postgreSqlVersion.Major == 9 && postgreSqlVersion.Minor > 2) { return(_postgreSQLDataProvider93.Value); } return(_postgreSQLDataProvider92.Value); } } catch { return(_postgreSQLDataProvider92.Value); } } return(GetDataProvider_PostgreSQL()); } switch (css.ProviderName) { case SybaseProviderAdapter.ManagedClientNamespace: case ProviderName.SybaseManaged: return(_sybaseManagedDataProvider.Value); #if NETFRAMEWORK case "Sybase.Native": case SybaseProviderAdapter.NativeClientNamespace: case SybaseProviderAdapter.NativeAssemblyName: return(_sybaseNativeDataProvider.Value); #endif case "": case null: if (css.Name.Contains("Sybase")) { goto case ProviderName.Sybase; } break; case ProviderName.Sybase: if (css.Name.Contains("Managed")) { return(_sybaseManagedDataProvider.Value); } #if NETFRAMEWORK if (css.Name.Contains("Native")) { return(_sybaseNativeDataProvider.Value); } #endif return(GetDataProvider_Sybase()); } if (css.IsGlobal) { return(null); } switch (css.ProviderName) { case ProviderName.MySqlOfficial: case MySqlProviderAdapter.MySqlDataAssemblyName: return(_mySqlDataProvider.Value); case ProviderName.MySqlConnector: return(_mySqlConnectorDataProvider.Value); case "": case null: if (css.Name.Contains("MySql")) { if (css.Name.Contains(MySqlProviderAdapter.MySqlConnectorAssemblyName)) { return(_mySqlConnectorDataProvider.Value); } if (css.Name.Contains(MySqlProviderAdapter.MySqlDataAssemblyName)) { return(_mySqlDataProvider.Value); } } break; case MySqlProviderAdapter.MySqlDataClientNamespace: case ProviderName.MySql: if (css.Name.Contains(MySqlProviderAdapter.MySqlConnectorAssemblyName)) { return(_mySqlConnectorDataProvider.Value); } if (css.Name.Contains(MySqlProviderAdapter.MySqlDataAssemblyName)) { return(_mySqlDataProvider.Value); } return(GetDataProvider_MySql()); case var providerName when providerName.Contains("MySql"): if (providerName.Contains(MySqlProviderAdapter.MySqlConnectorAssemblyName)) { return(_mySqlConnectorDataProvider.Value); } if (providerName.Contains(MySqlProviderAdapter.MySqlDataAssemblyName)) { return(_mySqlDataProvider.Value); } goto case ProviderName.MySql; } // DB2 ODS provider could be used by informix if (css.Name.Contains("Informix")) { return(null); } switch (css.ProviderName) { case ProviderName.DB2LUW: return(_db2DataProviderLUW.Value); case ProviderName.DB2zOS: return(_db2DataProviderzOS.Value); case "": case null: if (css.Name == "DB2") { goto case ProviderName.DB2; } break; case ProviderName.DB2: case DB2ProviderAdapter.NetFxClientNamespace: case DB2ProviderAdapter.CoreClientNamespace: if (css.Name.Contains("LUW")) { return(_db2DataProviderLUW.Value); } if (css.Name.Contains("z/OS") || css.Name.Contains("zOS")) { return(_db2DataProviderzOS.Value); } if (AutoDetectProvider) { try { var cs = string.IsNullOrWhiteSpace(connectionString) ? css.ConnectionString : connectionString; using (var conn = DB2ProviderAdapter.GetInstance().CreateConnection(cs)) { conn.Open(); var iszOS = conn.eServerType == DB2ProviderAdapter.DB2ServerTypes.DB2_390; return(iszOS ? _db2DataProviderzOS.Value : _db2DataProviderLUW.Value); } } catch { } } return(GetDataProvider_DB2()); } if (css.IsGlobal) { return(null); } switch (css.ProviderName) { case SQLiteProviderAdapter.SystemDataSQLiteClientNamespace: case ProviderName.SQLiteClassic: return(_SQLiteClassicDataProvider.Value); case SQLiteProviderAdapter.MicrosoftDataSQLiteClientNamespace: case "Microsoft.Data.SQLite": case ProviderName.SQLiteMS: return(_SQLiteMSDataProvider.Value); case "": case null: if (css.Name.Contains("SQLite") || css.Name.Contains("Sqlite")) { goto case ProviderName.SQLite; } break; case ProviderName.SQLite: if (css.Name.Contains("MS") || css.Name.Contains("Microsoft")) { return(_SQLiteMSDataProvider.Value); } if (css.Name.Contains("Classic")) { return(_SQLiteClassicDataProvider.Value); } return(GetDataProvider_SQLite()); case var providerName when providerName.Contains("SQLite") || providerName.Contains("Sqlite"): if (css.ProviderName.Contains("MS") || css.ProviderName.Contains("Microsoft")) { return(_SQLiteMSDataProvider.Value); } if (css.ProviderName.Contains("Classic")) { return(_SQLiteClassicDataProvider.Value); } return(GetDataProvider_SQLite()); } if (connectionString.Contains("Microsoft.ACE.OLEDB") || connectionString.Contains("Microsoft.Jet.OLEDB")) { return(_accessOleDbDataProvider.Value); } if (css.ProviderName == ProviderName.AccessOdbc || css.Name.Contains("Access.Odbc")) { return(_accessODBCDataProvider.Value); } if (css.ProviderName == ProviderName.Access || css.Name.Contains("Access")) { if (connectionString.Contains("*.mdb") || connectionString.Contains("*.accdb")) { return(_accessODBCDataProvider.Value); } return(_accessOleDbDataProvider.Value); } bool?managed = null; switch (css.ProviderName) { #if NETFRAMEWORK case OracleProviderAdapter.NativeAssemblyName: case OracleProviderAdapter.NativeClientNamespace: case ProviderName.OracleNative: managed = false; goto case ProviderName.Oracle; #endif case OracleProviderAdapter.ManagedAssemblyName: case OracleProviderAdapter.ManagedClientNamespace: case "Oracle.ManagedDataAccess.Core": case ProviderName.OracleManaged: managed = true; goto case ProviderName.Oracle; case "": case null: if (css.Name.Contains("Oracle")) { goto case ProviderName.Oracle; } break; case ProviderName.Oracle: #if NETFRAMEWORK if (css.Name.Contains("Native") || managed == false) { if (css.Name.Contains("11")) { return(_oracleNativeDataProvider11.Value); } if (css.Name.Contains("12")) { return(_oracleNativeDataProvider12.Value); } return(GetDataProvider(css, connectionString, false)); } #endif if (css.Name.Contains("Managed") || managed == true) { if (css.Name.Contains("11")) { return(_oracleManagedDataProvider11.Value); } if (css.Name.Contains("12")) { return(_oracleManagedDataProvider12.Value); } return(GetDataProvider_Oracle(css, connectionString, true)); } return(GetDataProvider_Oracle()); } var provider = Provider_SqlServer; if (css.ProviderName == SqlServerProviderAdapter.MicrosoftClientNamespace) { provider = SqlServerProvider.MicrosoftDataSqlClient; } else if (css.ProviderName == SqlServerProviderAdapter.SystemClientNamespace) { provider = SqlServerProvider.SystemDataSqlClient; } switch (css.ProviderName) { case "": case null: if (css.Name == "SqlServer") { goto case ProviderName.SqlServer; } break; // SqlClient use dot prefix, as SqlClient itself used by some other providers case var providerName when providerName.Contains("SqlServer") || providerName.Contains(".SqlClient"): case ProviderName.SqlServer: if (css.Name.Contains("2000") || css.ProviderName?.Contains("2000") == true) return(GetDataProvider_SqlServer(SqlServerVersion.v2000, provider)); if (css.Name.Contains("2005") || css.ProviderName?.Contains("2005") == true) return(GetDataProvider_SqlServer(SqlServerVersion.v2005, provider)); if (css.Name.Contains("2008") || css.ProviderName?.Contains("2008") == true) return(GetDataProvider_SqlServer(SqlServerVersion.v2008, provider)); if (css.Name.Contains("2012") || css.ProviderName?.Contains("2012") == true) return(GetDataProvider_SqlServer(SqlServerVersion.v2012, provider)); if (css.Name.Contains("2014") || css.ProviderName?.Contains("2014") == true) return(GetDataProvider_SqlServer(SqlServerVersion.v2012, provider)); if (css.Name.Contains("2016") || css.ProviderName?.Contains("2016") == true) return(GetDataProvider_SqlServer(SqlServerVersion.v2012, provider)); if (css.Name.Contains("2017") || css.ProviderName?.Contains("2017") == true) return(GetDataProvider_SqlServer(SqlServerVersion.v2017, provider)); if (css.Name.Contains("2019") || css.ProviderName?.Contains("2019") == true) return(GetDataProvider_SqlServer(SqlServerVersion.v2017, provider)); if (AutoDetectProvider) { try { var cs = string.IsNullOrWhiteSpace(connectionString) ? css.ConnectionString : connectionString; using (var conn = SqlServerProviderAdapter.GetInstance(provider).CreateConnection(cs)) { conn.Open(); if (int.TryParse(conn.ServerVersion.Split('.')[0], out var version)) { if (version <= 8) { return(GetDataProvider_SqlServer(SqlServerVersion.v2000, provider)); } using (var cmd = conn.CreateCommand()) { cmd.CommandText = "SELECT compatibility_level FROM sys.databases WHERE name = db_name()"; var level = Converter.ChangeTypeTo <int>(cmd.ExecuteScalar()); if (level >= 140) { return(GetDataProvider_SqlServer(SqlServerVersion.v2017, provider)); } if (level >= 110) { return(GetDataProvider_SqlServer(SqlServerVersion.v2012, provider)); } if (level >= 100) { return(GetDataProvider_SqlServer(SqlServerVersion.v2008, provider)); } if (level >= 90) { return(GetDataProvider_SqlServer(SqlServerVersion.v2005, provider)); } if (level >= 80) { return(GetDataProvider_SqlServer(SqlServerVersion.v2000, provider)); } switch (version) { case 8: return(GetDataProvider_SqlServer(SqlServerVersion.v2000, provider)); case 9: return(GetDataProvider_SqlServer(SqlServerVersion.v2005, provider)); case 10: return(GetDataProvider_SqlServer(SqlServerVersion.v2008, provider)); case 11: case 12: case 13: return(GetDataProvider_SqlServer(SqlServerVersion.v2012, provider)); case 14: case 15: return(GetDataProvider_SqlServer(SqlServerVersion.v2017, provider)); default: if (version > 15) { return(GetDataProvider_SqlServer(SqlServerVersion.v2017, provider)); } return(GetDataProvider_SqlServer(SqlServerVersion.v2008, provider)); } } } } } catch { } } return(GetDataProvider_SqlServer(provider: provider)); } return(null); }