Ejemplo n.º 1
0
        protected override void AddSourceValue(
            ValueToSqlConverter valueConverter,
            ColumnDescriptor column,
            SqlDataType columnType,
            object value,
            bool isFirstRow,
            bool isLastRow)
        {
            // informix have really hard times to recognize it's own types, so in source we need to specify type
            // hint for most of types
            if (value != null)
            {
                if (!valueConverter.TryConvert(Command, columnType, value))
                {
                    AddSourceValueAsParameter(column.DataType, value);

                    // even for parameters
                    WriteTypeHint(column, columnType);
                }
                else
                {
                    if (value is decimal && columnType.Precision == null &&
                        (columnType.DataType == DataType.Decimal || columnType.DataType == DataType.Undefined))
                    {
                        var decValue = (decimal)value;

                        var precision = 0;
                        var str       = decValue.ToString(CultureInfo.InvariantCulture);
                        var dotIndex  = str.IndexOf(".");
                        if (dotIndex >= 0)
                        {
                            precision = str.Substring(0, dotIndex).TrimStart('0').Length;
                        }

                        var scale = BitConverter.GetBytes(decimal.GetBits(decValue)[3])[2];
                        precision += scale;

                        columnType = new SqlDataType(DataType.Decimal, columnType.Type, null, precision, scale);
                    }

                    // this is the only place where hint is not required for some types but it doesn't make sense to
                    // write extra logic to detect when it could be skipped
                    WriteTypeHint(column, columnType);
                }
            }
            else
            {
                Command.Append("NULL");
                WriteTypeHint(column, columnType);
            }
        }
Ejemplo n.º 2
0
        public MappingSchema(string configuration, params MappingSchema[] schemas)
        {
            var schemaInfo = new MappingSchemaInfo(configuration);

            if (schemas == null || schemas.Length == 0)
            {
                Schemas = new[] { schemaInfo, Default.Schemas[0] };

                ValueToSqlConverter = new ValueToSqlConverter(Default.ValueToSqlConverter);
            }
            else if (schemas.Length == 1)
            {
                Schemas    = new MappingSchemaInfo[1 + schemas[0].Schemas.Length];
                Schemas[0] = schemaInfo;
                Array.Copy(schemas[0].Schemas, 0, Schemas, 1, schemas[0].Schemas.Length);

                var baseConverters = new ValueToSqlConverter[1 + schemas[0].ValueToSqlConverter.BaseConverters.Length];
                baseConverters[0] = schemas[0].ValueToSqlConverter;
                Array.Copy(schemas[0].ValueToSqlConverter.BaseConverters, 0, baseConverters, 1, schemas[0].ValueToSqlConverter.BaseConverters.Length);

                ValueToSqlConverter = new ValueToSqlConverter(baseConverters);
            }
            else
            {
                var schemaList     = new Dictionary <MappingSchemaInfo, int>(schemas.Length);
                var baseConverters = new Dictionary <ValueToSqlConverter, int>(10);

                var i = 0;
                var j = 0;

                schemaList[schemaInfo] = i++;

                foreach (var schema in schemas)
                {
                    foreach (var sc in schema.Schemas)
                    {
                        schemaList[sc] = i++;
                    }

                    baseConverters[schema.ValueToSqlConverter] = j++;

                    foreach (var bc in schema.ValueToSqlConverter.BaseConverters)
                    {
                        baseConverters[bc] = j++;
                    }
                }

                Schemas             = schemaList.OrderBy(_ => _.Value).Select(_ => _.Key).ToArray();
                ValueToSqlConverter = new ValueToSqlConverter(baseConverters.OrderBy(_ => _.Value).Select(_ => _.Key).ToArray());
            }
        }
Ejemplo n.º 3
0
            public DefaultMappingSchema()
                : base(new MappingSchemaInfo("") { MetadataReader = Metadata.MetadataReader.Default })
            {
                AddScalarType(typeof(char), DataType.NChar);
                AddScalarType(typeof(char?), DataType.NChar);
                AddScalarType(typeof(string), DataType.NVarChar);
                AddScalarType(typeof(decimal), DataType.Decimal);
                AddScalarType(typeof(decimal?), DataType.Decimal);
                AddScalarType(typeof(DateTime), DataType.DateTime2);
                AddScalarType(typeof(DateTime?), DataType.DateTime2);
                AddScalarType(typeof(DateTimeOffset), DataType.DateTimeOffset);
                AddScalarType(typeof(DateTimeOffset?), DataType.DateTimeOffset);
                AddScalarType(typeof(TimeSpan), DataType.Time);
                AddScalarType(typeof(TimeSpan?), DataType.Time);
                AddScalarType(typeof(byte[]), DataType.VarBinary);
                AddScalarType(typeof(Binary), DataType.VarBinary);
                AddScalarType(typeof(Guid), DataType.Guid);
                AddScalarType(typeof(Guid?), DataType.Guid);
                AddScalarType(typeof(object), DataType.Variant);
#if !SILVERLIGHT && !NETFX_CORE
                AddScalarType(typeof(XmlDocument), DataType.Xml);
#endif
                AddScalarType(typeof(XDocument), DataType.Xml);
                AddScalarType(typeof(bool), DataType.Boolean);
                AddScalarType(typeof(bool?), DataType.Boolean);
                AddScalarType(typeof(sbyte), DataType.SByte);
                AddScalarType(typeof(sbyte?), DataType.SByte);
                AddScalarType(typeof(short), DataType.Int16);
                AddScalarType(typeof(short?), DataType.Int16);
                AddScalarType(typeof(int), DataType.Int32);
                AddScalarType(typeof(int?), DataType.Int32);
                AddScalarType(typeof(long), DataType.Int64);
                AddScalarType(typeof(long?), DataType.Int64);
                AddScalarType(typeof(byte), DataType.Byte);
                AddScalarType(typeof(byte?), DataType.Byte);
                AddScalarType(typeof(ushort), DataType.UInt16);
                AddScalarType(typeof(ushort?), DataType.UInt16);
                AddScalarType(typeof(uint), DataType.UInt32);
                AddScalarType(typeof(uint?), DataType.UInt32);
                AddScalarType(typeof(ulong), DataType.UInt64);
                AddScalarType(typeof(ulong?), DataType.UInt64);
                AddScalarType(typeof(float), DataType.Single);
                AddScalarType(typeof(float?), DataType.Single);
                AddScalarType(typeof(double), DataType.Double);
                AddScalarType(typeof(double?), DataType.Double);

                AddScalarType(typeof(BitArray), DataType.BitArray);

                ValueToSqlConverter.SetDefauls();
            }
Ejemplo n.º 4
0
 public MultipleRowsHelper(DataConnection dataConnection, BulkCopyOptions options, bool enforceKeepIdentity)
 {
     DataConnection = dataConnection;
     Options        = options;
     SqlBuilder     = dataConnection.DataProvider.CreateSqlBuilder();
     ValueConverter = dataConnection.MappingSchema.ValueToSqlConverter;
     Descriptor     = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
     Columns        = Descriptor.Columns
                      .Where(c => !c.SkipOnInsert || enforceKeepIdentity && options.KeepIdentity == true && c.IsIdentity)
                      .ToArray();
     ColumnTypes =
         Columns.Select(c => new SqlDataType(c.DataType, c.MemberType, c.Length, c.Precision, c.Scale)).ToArray();
     ParameterName = SqlBuilder.Convert("p", ConvertType.NameToQueryParameter).ToString();
     TableName     = BasicBulkCopy.GetTableName(SqlBuilder, options, Descriptor);
     BatchSize     = Math.Max(10, Options.MaxBatchSize ?? 1000);
 }
Ejemplo n.º 5
0
        protected override void AddSourceValue(ValueToSqlConverter valueConverter, ColumnDescriptor column, SqlDataType columnType, object value, bool isFirstRow, bool isLastRow)
        {
            if (!_columnTypedTracker.ContainsKey(column))
            {
                _columnTypedTracker.Add(column, value != null);
            }

            if (value == null)
            {
                /* DB2 doesn't like NULLs without type information
                 * : ERROR [42610] [IBM][DB2/NT64] SQL0418N  The statement was not processed because the statement
                 * contains an invalid use of one of the following: an untyped parameter marker, the DEFAULT keyword
                 * , or a null value.
                 *
                 * See https://stackoverflow.com/questions/13381898
                 *
                 * Unfortunatelly, just use typed parameter doesn't help
                 *
                 * To fix it we need to cast at least one NULL in column if all column values are null.
                 * We will do it for last row, when we know that there is no non-null values in column and type hint
                 * needed.
                 *
                 * One thing I don't like is that in some cases DB2 can process query without type hints
                 */

                if (isLastRow && !_columnTypedTracker[column])
                {
                    // we type only NULLs in last row and only if there is no non-NULL values in other rows
                    // adding casts in other cases not required and could even lead to type conflicts if type in
                    // cast not compatible with non-null values in column
                    Command.Append("CAST(NULL AS ");
                    BuildColumnType(column, columnType);
                    Command.Append(")");
                    return;
                }
            }
            else
            {
                _columnTypedTracker[column] = true;
            }

            base.AddSourceValue(valueConverter, column, columnType, value, isFirstRow, isLastRow);
        }
Ejemplo n.º 6
0
 protected override void AddSourceValue(ValueToSqlConverter valueConverter, ColumnDescriptor column, SqlDataType columnType, object value, bool isFirstRow, bool isLastRow)
 {
     if (value == null || value is INullable && ((INullable)value).IsNull)
     {
         var casttype = (columnType.DataType == DataType.Undefined) ?
                        columnType.Type.GetTypeForCast(MapGuidAsString) :
                        SqlDataType.GetDataType(columnType.DataType).GetiSeriesType(MapGuidAsString);
         Command.Append($"CAST(NULL AS {casttype})");
         return;
     }
     // avoid parameters in source due to low limits for parameters number in providers
     if (!valueConverter.TryConvert(Command, columnType, value))
     {
         var colType = value.GetType().GetTypeForCast(MapGuidAsString);
         // we have to use parameter wrapped in a cast
         var name     = GetNextParameterName();
         var fullName = SqlBuilder.Convert(name, ConvertType.NameToQueryParameter).ToString();
         Command.Append($"CAST({fullName} as {colType})");
         AddParameter(new DataParameter(name, value, column.DataType));
     }
 }
Ejemplo n.º 7
0
        public override ISqlExpression GetIdentityExpression(SqlTable table)
        {
            if (!table.SequenceAttributes.IsNullOrEmpty())
            {
                var attr = GetSequenceNameAttribute(table, false);

                if (attr != null)
                {
                    var name     = Convert(attr.SequenceName, ConvertType.NameToQueryTable).ToString();
                    var database = GetTableDatabaseName(table);
                    var schema   = attr.Schema != null
                                                ? Convert(attr.Schema, ConvertType.NameToSchema).ToString()
                                                : GetTableSchemaName(table);

                    var sb = new StringBuilder();
                    sb.Append("nextval(");
                    ValueToSqlConverter.Convert(sb, BuildTableName(new StringBuilder(), database, schema, name).ToString());
                    sb.Append(")");
                    return(new SqlExpression(sb.ToString(), Precedence.Primary));
                }
            }

            return(base.GetIdentityExpression(table));
        }
        protected override void AddSourceValue(
            ValueToSqlConverter valueConverter,
            ColumnDescriptor column,
            SqlDataType columnType,
            object value,
            bool isFirstRow,
            bool isLastRow)
        {
            if (value != null)
            {
                var dataType = columnType.DataType != DataType.Undefined
                                        ? columnType.DataType
                                        : DataContext.MappingSchema.GetDataType(column.MemberType).DataType;

                if (dataType == DataType.Binary || dataType == DataType.VarBinary)
                {
                    // don't generate binary literal in source, as it could lead to huge SQL
                    AddSourceValueAsParameter(dataType, column.DbType, value);
                    return;
                }
            }

            base.AddSourceValue(valueConverter, column, columnType, value, isFirstRow, isLastRow);
        }
Ejemplo n.º 9
0
        internal MappingSchema(MappingSchemaInfo mappingSchemaInfo)
        {
            Schemas = new[] { mappingSchemaInfo };

            ValueToSqlConverter = new ValueToSqlConverter();
        }
Ejemplo n.º 10
0
        public MappingSchema(string configuration, params MappingSchema[] schemas)
        {
            var schemaInfo = new MappingSchemaInfo(configuration);

            if (schemas == null || schemas.Length == 0)
            {
                Schemas = new[] { schemaInfo, Default.Schemas[0] };

                ValueToSqlConverter = new ValueToSqlConverter(Default.ValueToSqlConverter);
            }
            else if (schemas.Length == 1)
            {
                Schemas    = new MappingSchemaInfo[1 + schemas[0].Schemas.Length];
                Schemas[0] = schemaInfo;
                Array.Copy(schemas[0].Schemas, 0, Schemas, 1, schemas[0].Schemas.Length);

                var baseConverters = new ValueToSqlConverter[1 + schemas[0].ValueToSqlConverter.BaseConverters.Length];
                baseConverters[0] = schemas[0].ValueToSqlConverter;
                Array.Copy(schemas[0].ValueToSqlConverter.BaseConverters, 0, baseConverters, 1, schemas[0].ValueToSqlConverter.BaseConverters.Length);

                ValueToSqlConverter = new ValueToSqlConverter(baseConverters);
            }
            else
            {
                var schemaList = new List <MappingSchemaInfo>(10)
                {
                    schemaInfo
                };
                var baseConverters = new List <ValueToSqlConverter>(10);

                foreach (var schema in schemas)
                {
                    foreach (var sc in schema.Schemas)
                    {
                        if (schemaList.Contains(sc))
                        {
                            schemaList.Remove(sc);
                        }
                        schemaList.Add(sc);
                    }

                    if (baseConverters.Contains(schema.ValueToSqlConverter))
                    {
                        baseConverters.Remove(schema.ValueToSqlConverter);
                    }
                    baseConverters.Add(schema.ValueToSqlConverter);

                    foreach (var bc in schema.ValueToSqlConverter.BaseConverters)
                    {
                        if (baseConverters.Contains(bc))
                        {
                            baseConverters.Remove(bc);
                        }
                        baseConverters.Add(bc);
                    }
                }

                Schemas             = schemaList.ToArray();
                ValueToSqlConverter = new ValueToSqlConverter(baseConverters.ToArray());
            }
        }
Ejemplo n.º 11
0
 public SapHanaOdbcSqlBuilder(ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
     : base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
 {
 }
Ejemplo n.º 12
0
 protected DB2SqlBuilderBase(ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
     : base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
 {
 }
Ejemplo n.º 13
0
		SybaseSqlBuilder(bool skipAliases, ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
			: base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
		{
			_skipAliases = skipAliases;
		}
Ejemplo n.º 14
0
 public AccessSqlBuilder_OleDb(ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
     : base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
 {
 }
Ejemplo n.º 15
0
 public FirebirdSqlBuilder(ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
     : base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
 {
 }
 public DB2iSeriesSqlBuilder7_2(ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
     : base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
 {
 }
Ejemplo n.º 17
0
        protected override void AddSourceValue(
            ValueToSqlConverter valueConverter,
            ColumnDescriptor column,
            SqlDataType columnType,
            object value,
            bool isFirstRow)
        {
            // strange thing, that real type needs explicit typing only on some combinations of columns and values
            // from other side, for Sybase it is not surprising
            if (column.DataType == DataType.Single || (column.DataType == DataType.Undefined && column.MemberType.ToNullableUnderlying() == typeof(float)))
            {
                Command.Append("CAST(");
                base.AddSourceValue(valueConverter, column, columnType, value, isFirstRow);
                Command.Append(" AS REAL)");
            }
            else if (column.DataType == DataType.DateTime || column.DataType == DataType.DateTime2)
            {
                Command.Append("CAST(");
                base.AddSourceValue(valueConverter, column, columnType, value, isFirstRow);
                Command.Append(" AS DATETIME)");
            }
            else if (column.DataType == DataType.Date)
            {
                Command.Append("CAST(");
                base.AddSourceValue(valueConverter, column, columnType, value, isFirstRow);
                Command.Append(" AS DATE)");
            }
            else if (column.DataType == DataType.Time)
            {
                Command.Append("CAST(");
                base.AddSourceValue(valueConverter, column, columnType, value, isFirstRow);
                Command.Append(" AS TIME)");
            }
            else if (isFirstRow && value == null)
            {
                string type;

                if (column.DbType != null)
                {
                    type = column.DbType;
                }
                else
                {
                    var dataType = column.DataType != DataType.Undefined ?
                                   column.DataType :
                                   DataContext.MappingSchema.GetDataType(column.MemberType).DataType;

                    switch (dataType)
                    {
                    case DataType.Double: type = "FLOAT";    break;

                    case DataType.Single: type = "REAL";     break;

                    case DataType.SByte: type = "TINYINT";  break;

                    case DataType.UInt16: type = "INT";      break;

                    case DataType.UInt32: type = "BIGINT";   break;

                    case DataType.UInt64: type = "DECIMAL";  break;

                    case DataType.Byte: type = "TINYINT";  break;

                    case DataType.Int16: type = "SMALLINT"; break;

                    case DataType.Int32: type = "INT";      break;

                    case DataType.Int64: type = "BIGINT";   break;

                    case DataType.Boolean: type = "BIT";      break;

                    default: type = null;       break;
                    }
                }

                if (type != null)
                {
                    Command
                    .Append("CAST(NULL AS ")
                    .Append(type)
                    ;

                    if (column.Length > 0)
                    {
                        Command
                        .Append('(')
                        .Append(column.Length)
                        .Append(')')
                        ;
                    }

                    if (column.Precision > 0)
                    {
                        Command
                        .Append('(')
                        .Append(column.Precision)
                        .Append(',')
                        .Append(column.Scale)
                        .Append(')')
                        ;
                    }

                    Command
                    .Append(")")
                    ;
                }
                else
                {
                    base.AddSourceValue(valueConverter, column, columnType, value, isFirstRow);
                }
            }
            else
            {
                base.AddSourceValue(valueConverter, column, columnType, value, isFirstRow);
            }
        }
Ejemplo n.º 18
0
 SybaseSqlBuilder(bool skipAliases, ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
     : base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
 {
     _skipAliases = skipAliases;
 }
Ejemplo n.º 19
0
 public DB2iSeriesSqlBuilder(ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags,
                             ValueToSqlConverter valueToSqlConverter)
     : base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
 {
     this.mapGuidAsString = sqlProviderFlags.CustomFlags.Contains(DB2iSeriesTools.MapGuidAsString);
 }
Ejemplo n.º 20
0
 public Npgsql4PostgreSQLSqlBuilder(Npgsql4PostgreSQLDataProvider provider, ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
     : base(provider, sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
 {
     _provider = provider;
 }
Ejemplo n.º 21
0
 public DB2iSeriesSqlBuilder7_2(ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags,
                                ValueToSqlConverter valueToSqlConverter, DB2iSeriesNamingConvention namingConvention = default)
     : base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter, namingConvention)
 {
 }
Ejemplo n.º 22
0
 public PostgreSQLSqlBuilder(ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
     : base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
 {
 }
 public PostgreSQLSqlBuilder(PostgreSQLDataProvider provider, ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
     : this(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
 {
     _provider = provider;
 }
Ejemplo n.º 24
0
		public SqlCeSqlBuilder(ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
			: base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
		{
		}
Ejemplo n.º 25
0
		protected SqlServerSqlBuilder(ISqlOptimizer sqlOptimizer, SqlProviderFlags sqlProviderFlags, ValueToSqlConverter valueToSqlConverter)
			: base(sqlOptimizer, sqlProviderFlags, valueToSqlConverter)
		{
		}