Example #1
0
        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);
            }
        }
Example #2
0
        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;
        }
Example #3
0
        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);
        }