public static OleDbProviderAdapter GetInstance()
        {
            if (_instance == null)
            {
                lock (_syncRoot)
                    if (_instance == null)
                    {
#if NET45 || NET46
                        var assembly = typeof(System.Data.OleDb.OleDbConnection).Assembly;
#else
                        var assembly = LinqToDB.Common.Tools.TryLoadAssembly(AssemblyName, null);
                        if (assembly == null)
                        {
                            throw new InvalidOperationException($"Cannot load assembly {AssemblyName}");
                        }
#endif

                        var connectionType  = assembly.GetType($"{ClientNamespace}.OleDbConnection", true);
                        var dataReaderType  = assembly.GetType($"{ClientNamespace}.OleDbDataReader", true);
                        var parameterType   = assembly.GetType($"{ClientNamespace}.OleDbParameter", true);
                        var commandType     = assembly.GetType($"{ClientNamespace}.OleDbCommand", true);
                        var transactionType = assembly.GetType($"{ClientNamespace}.OleDbTransaction", true);
                        var dbType          = assembly.GetType($"{ClientNamespace}.OleDbType", true);

                        var typeMapper = new TypeMapper();
                        typeMapper.RegisterTypeWrapper <OleDbConnection>(connectionType);
                        typeMapper.RegisterTypeWrapper <OleDbType>(dbType);
                        typeMapper.RegisterTypeWrapper <OleDbParameter>(parameterType);
                        typeMapper.FinalizeMappings();

                        var dbTypeBuilder = typeMapper.Type <OleDbParameter>().Member(p => p.OleDbType);
                        var typeSetter    = dbTypeBuilder.BuildSetter <IDbDataParameter>();
                        var typeGetter    = dbTypeBuilder.BuildGetter <IDbDataParameter>();

                        var oleDbSchemaTableGetter = typeMapper.BuildFunc <IDbConnection, Guid, object[]?, DataTable>(typeMapper.MapLambda((OleDbConnection conn, Guid schema, object[]? restrictions) => conn.GetOleDbSchemaTable(schema, restrictions)));

                        _instance = new OleDbProviderAdapter(
                            connectionType,
                            dataReaderType,
                            parameterType,
                            commandType,
                            transactionType,
                            typeSetter,
                            typeGetter,
                            oleDbSchemaTableGetter);
                    }
            }

            return(_instance);
        }
Exemple #2
0
        public static DB2iSeriesAccessClientProviderAdapter GetInstance()
        {
            if (_instance == null)
            {
                lock (_syncRoot)
                    if (_instance == null)
                    {
                        var assembly = Common.Tools.TryLoadAssembly(AssemblyName, ProviderFactoryName);
                        if (assembly == null)
                        {
                            throw new InvalidOperationException($"Cannot load assembly {AssemblyName}");
                        }

                        var connectionType  = assembly.GetType($"{ClientNamespace}.iDB2Connection", true);
                        var parameterType   = assembly.GetType($"{ClientNamespace}.iDB2Parameter", true);
                        var dataReaderType  = assembly.GetType($"{ClientNamespace}.iDB2DataReader", true);
                        var transactionType = assembly.GetType($"{ClientNamespace}.iDB2Transaction", true);
                        var commandType     = assembly.GetType($"{ClientNamespace}.iDB2Command", true);
                        var dbType          = assembly.GetType($"{ClientNamespace}.iDB2DbType", true);

                        var mappingSchema = new MappingSchema();

                        var iDB2BigIntType         = loadType("iDB2BigInt", DataType.Int64);
                        var iDB2BinaryType         = loadType("iDB2Binary", DataType.Binary);
                        var iDB2BlobType           = loadType("iDB2Blob", DataType.Blob);
                        var iDB2CharType           = loadType("iDB2Char", DataType.Char);
                        var iDB2CharBitDataType    = loadType("iDB2CharBitData", DataType.Binary);
                        var iDB2ClobType           = loadType("iDB2Clob", DataType.Text);
                        var iDB2DataLinkType       = loadType("iDB2DataLink", DataType.NText);
                        var iDB2DateType           = loadType("iDB2Date", DataType.Date);
                        var iDB2DbClobType         = loadType("iDB2DbClob", DataType.NText);
                        var iDB2DecFloat16Type     = loadType("iDB2DecFloat16", DataType.Decimal);
                        var iDB2DecFloat34Type     = loadType("iDB2DecFloat34", DataType.Decimal);
                        var iDB2DecimalType        = loadType("iDB2Decimal", DataType.Decimal);
                        var iDB2DoubleType         = loadType("iDB2Double", DataType.Double);
                        var iDB2GraphicType        = loadType("iDB2Graphic", DataType.NChar);
                        var iDB2IntegerType        = loadType("iDB2Integer", DataType.Int32);
                        var iDB2NumericType        = loadType("iDB2Numeric", DataType.Decimal);
                        var iDB2RealType           = loadType("iDB2Real", DataType.Single);
                        var iDB2RowidType          = loadType("iDB2Rowid", DataType.VarBinary);
                        var iDB2SmallIntType       = loadType("iDB2SmallInt", DataType.Int16);
                        var iDB2TimeType           = loadType("iDB2Time", DataType.Time);
                        var iDB2TimeStampType      = loadType("iDB2TimeStamp", DataType.DateTime2);
                        var iDB2VarBinaryType      = loadType("iDB2VarBinary", DataType.VarBinary);
                        var iDB2VarCharType        = loadType("iDB2VarChar", DataType.VarChar);
                        var iDB2VarCharBitDataType = loadType("iDB2VarCharBitData", DataType.VarBinary);
                        var iDB2VarGraphicType     = loadType("iDB2VarGraphic", DataType.NVarChar);
                        var iDB2XmlType            = loadType("iDB2Xml", DataType.Xml);

                        var typeMapper = new TypeMapper();

                        typeMapper.RegisterTypeWrapper <iDB2Connection>(connectionType);
                        typeMapper.RegisterTypeWrapper <iDB2Parameter>(parameterType);
                        typeMapper.RegisterTypeWrapper <iDB2DbType>(dbType);

                        typeMapper.FinalizeMappings();

                        var dbTypeBuilder = typeMapper.Type <iDB2Parameter>().Member(p => p.iDB2DbType);
                        var typeSetter    = dbTypeBuilder.BuildSetter <IDbDataParameter>();
                        var typeGetter    = dbTypeBuilder.BuildGetter <IDbDataParameter>();

                        _instance = new DB2iSeriesAccessClientProviderAdapter(
                            connectionType,
                            dataReaderType,
                            parameterType,
                            commandType,
                            transactionType,

                            iDB2BigIntType,
                            iDB2BinaryType,
                            iDB2BlobType,
                            iDB2CharType,
                            iDB2CharBitDataType,
                            iDB2ClobType,
                            iDB2DataLinkType,
                            iDB2DateType,
                            iDB2DbClobType,
                            iDB2DecFloat16Type,
                            iDB2DecFloat34Type,
                            iDB2DecimalType,
                            iDB2DoubleType,
                            iDB2GraphicType,
                            iDB2IntegerType,
                            iDB2NumericType,
                            iDB2RealType,
                            iDB2RowidType,
                            iDB2SmallIntType,
                            iDB2TimeType,
                            iDB2TimeStampType,
                            iDB2VarBinaryType,
                            iDB2VarCharType,
                            iDB2VarCharBitDataType,
                            iDB2VarGraphicType,
                            iDB2XmlType,

                            mappingSchema,

                            typeSetter,
                            typeGetter,
                            typeMapper.BuildWrappedFactory((string connectionString) => new iDB2Connection(connectionString)),
                            typeMapper.BuildFunc <IDbConnection, string>(typeMapper.MapLambda((iDB2Connection conn) => conn.LibraryList)),
                            typeMapper.BuildFunc <IDbConnection, iDB2NamingConvention>(typeMapper.MapLambda((iDB2Connection conn) => conn.Naming)),

                            buildActionInvoker(commandType, "DeriveParameters"),
                            buildActionInvoker(commandType, "AddBatch")
                            );

                        DataConnection.WriteTraceLine(assembly.FullName, nameof(DB2iSeriesAccessClientProviderAdapter), System.Diagnostics.TraceLevel.Info);
            internal static MySqlProviderAdapter CreateAdapter()
            {
                var assembly = Common.Tools.TryLoadAssembly(MySqlDataAssemblyName, null);

                if (assembly == null)
                {
                    throw new InvalidOperationException($"Cannot load assembly {MySqlDataAssemblyName}");
                }

                var connectionType    = assembly.GetType($"{MySqlDataClientNamespace}.MySqlConnection", true) !;
                var dataReaderType    = assembly.GetType($"{MySqlDataClientNamespace}.MySqlDataReader", true) !;
                var parameterType     = assembly.GetType($"{MySqlDataClientNamespace}.MySqlParameter", true) !;
                var commandType       = assembly.GetType($"{MySqlDataClientNamespace}.MySqlCommand", true) !;
                var transactionType   = assembly.GetType($"{MySqlDataClientNamespace}.MySqlTransaction", true) !;
                var dbType            = assembly.GetType($"{MySqlDataClientNamespace}.MySqlDbType", true) !;
                var mySqlDecimalType  = assembly.GetType($"{MySqlDataTypesNamespace}.MySqlDecimal", true) !;
                var mySqlDateTimeType = assembly.GetType($"{MySqlDataTypesNamespace}.MySqlDateTime", true) !;
                var mySqlGeometryType = assembly.GetType($"{MySqlDataTypesNamespace}.MySqlGeometry", true) !;

                var typeMapper = new TypeMapper();

                typeMapper.RegisterTypeWrapper <MySqlParameter>(parameterType);
                typeMapper.RegisterTypeWrapper <MySqlDbType>(dbType);
                typeMapper.RegisterTypeWrapper <MySqlDateTime>(mySqlDateTimeType);
                typeMapper.RegisterTypeWrapper <MySqlDecimal>(mySqlDecimalType);

                var dbTypeGetter       = typeMapper.Type <MySqlParameter>().Member(p => p.MySqlDbType).BuildGetter <IDbDataParameter>();
                var decimalGetter      = typeMapper.BuildFunc <object, string>(typeMapper.MapLambda((object value) => ((MySqlDecimal)value).ToString()));
                var toDecimalConverter = typeMapper.MapLambda((MySqlDecimal d) => d.Value);
                var toDoubleConverter  = typeMapper.MapLambda((MySqlDecimal d) => d.ToDouble());
                var dateTimeConverter  = typeMapper.MapLambda((MySqlDateTime dt) => dt.GetDateTime());

                var mappingSchema = new MappingSchema();

                mappingSchema.SetDataType(mySqlDecimalType, DataType.Decimal);
                mappingSchema.SetConvertExpression(mySqlDecimalType, typeof(decimal), toDecimalConverter);
                mappingSchema.SetConvertExpression(mySqlDecimalType, typeof(double), toDoubleConverter);
                mappingSchema.SetValueToSqlConverter(mySqlDecimalType, typeMapper.BuildAction <StringBuilder, SqlDataType, object>(typeMapper.MapActionLambda((StringBuilder sb, SqlDataType type, object value) => AppendAction(sb, ((MySqlDecimal)value).ToString()))));

                mappingSchema.SetDataType(mySqlDateTimeType, DataType.DateTime2);
                mappingSchema.SetConvertExpression(mySqlDateTimeType, typeof(DateTime), dateTimeConverter);

                return(new MySqlProviderAdapter(
                           MySqlProvider.MySqlData,
                           connectionType,
                           dataReaderType,
                           parameterType,
                           commandType,
                           transactionType,
                           mySqlDecimalType,
                           mySqlDateTimeType,
                           mySqlGeometryType,
                           decimalGetter,
                           p => dbTypeGetter(p),
                           "GetMySqlDecimal",
                           null,
                           "GetMySqlDateTime",
                           MySqlDataTypesNamespace,
                           mappingSchema,
                           null));
            }