Esempio n. 1
0
        public SqlServerMappingSchema()
            : base(ProviderName.SqlServer)
        {
            ColumnNameComparer = StringComparer.OrdinalIgnoreCase;

            SetConvertExpression <SqlXml, XmlReader>(
                s => s.IsNull ? DefaultValue <XmlReader> .Value : s.CreateReader(),
                s => s.CreateReader());

            SetConvertExpression <string, SqlXml>(s => new SqlXml(new MemoryStream(Encoding.UTF8.GetBytes(s))));

            AddScalarType(typeof(SqlBinary), SqlBinary.Null, true, DataType.VarBinary);
            AddScalarType(typeof(SqlBinary?), SqlBinary.Null, true, DataType.VarBinary);
            AddScalarType(typeof(SqlBoolean), SqlBoolean.Null, true, DataType.Boolean);
            AddScalarType(typeof(SqlBoolean?), SqlBoolean.Null, true, DataType.Boolean);
            AddScalarType(typeof(SqlByte), SqlByte.Null, true, DataType.Byte);
            AddScalarType(typeof(SqlByte?), SqlByte.Null, true, DataType.Byte);
            AddScalarType(typeof(SqlDateTime), SqlDateTime.Null, true, DataType.DateTime);
            AddScalarType(typeof(SqlDateTime?), SqlDateTime.Null, true, DataType.DateTime);
            AddScalarType(typeof(SqlDecimal), SqlDecimal.Null, true, DataType.Decimal);
            AddScalarType(typeof(SqlDecimal?), SqlDecimal.Null, true, DataType.Decimal);
            AddScalarType(typeof(SqlDouble), SqlDouble.Null, true, DataType.Double);
            AddScalarType(typeof(SqlDouble?), SqlDouble.Null, true, DataType.Double);
            AddScalarType(typeof(SqlGuid), SqlGuid.Null, true, DataType.Guid);
            AddScalarType(typeof(SqlGuid?), SqlGuid.Null, true, DataType.Guid);
            AddScalarType(typeof(SqlInt16), SqlInt16.Null, true, DataType.Int16);
            AddScalarType(typeof(SqlInt16?), SqlInt16.Null, true, DataType.Int16);
            AddScalarType(typeof(SqlInt32), SqlInt32.Null, true, DataType.Int32);
            AddScalarType(typeof(SqlInt32?), SqlInt32.Null, true, DataType.Int32);
            AddScalarType(typeof(SqlInt64), SqlInt64.Null, true, DataType.Int64);
            AddScalarType(typeof(SqlInt64?), SqlInt64.Null, true, DataType.Int64);
            AddScalarType(typeof(SqlMoney), SqlMoney.Null, true, DataType.Money);
            AddScalarType(typeof(SqlMoney?), SqlMoney.Null, true, DataType.Money);
            AddScalarType(typeof(SqlSingle), SqlSingle.Null, true, DataType.Single);
            AddScalarType(typeof(SqlSingle?), SqlSingle.Null, true, DataType.Single);
            AddScalarType(typeof(SqlString), SqlString.Null, true, DataType.NVarChar);
            AddScalarType(typeof(SqlString?), SqlString.Null, true, DataType.NVarChar);
            AddScalarType(typeof(SqlXml), SqlXml.Null, true, DataType.Xml);

            AddScalarType(typeof(DateTime), DataType.DateTime);
            AddScalarType(typeof(DateTime?), DataType.DateTime);

            SqlServerTypes.Configure(this);

            SetValueToSqlConverter(typeof(string), (sb, dt, v) => ConvertStringToSql(sb, dt, v.ToString() !));
            SetValueToSqlConverter(typeof(char), (sb, dt, v) => ConvertCharToSql(sb, dt, (char)v));
            SetValueToSqlConverter(typeof(DateTime), (sb, dt, v) => ConvertDateTimeToSql(sb, null, (DateTime)v));
            SetValueToSqlConverter(typeof(TimeSpan), (sb, dt, v) => ConvertTimeSpanToSql(sb, dt, (TimeSpan)v));
            SetValueToSqlConverter(typeof(DateTimeOffset), (sb, dt, v) => ConvertDateTimeOffsetToSql(sb, dt, (DateTimeOffset)v));
            SetValueToSqlConverter(typeof(byte[]), (sb, dt, v) => ConvertBinaryToSql(sb, (byte[])v));
            SetValueToSqlConverter(typeof(Binary), (sb, dt, v) => ConvertBinaryToSql(sb, ((Binary)v).ToArray()));

            SetDataType(typeof(string), new SqlDataType(DataType.NVarChar, typeof(string)));

            AddMetadataReader(new SystemDataSqlServerAttributeReader());
        }
Esempio n. 2
0
 /// <summary>
 /// Registers spatial types assembly (Microsoft.SqlServer.Types).
 /// Also check https://linq2db.github.io/articles/FAQ.html#how-can-i-use-sql-server-spatial-types
 /// for additional required configuration steps.
 /// </summary>
 public static void ResolveSqlTypes(Assembly assembly)
 {
     if (SqlServerTypes.UpdateTypes(assembly))
     {
         foreach (var provider in _providers)
         {
             SqlServerTypes.Configure(provider);
         }
     }
 }
Esempio n. 3
0
        /// <summary>
        /// Tries to load and register spatial types using provided path to types assembly (Microsoft.SqlServer.Types).
        /// Also check https://linq2db.github.io/articles/FAQ.html#how-can-i-use-sql-server-spatial-types
        /// for additional required configuration steps.
        /// </summary>
        public static void ResolveSqlTypes(string path)
        {
            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }

            new AssemblyResolver(path, SqlServerTypes.AssemblyName);

            if (SqlServerTypes.UpdateTypes())
            {
                foreach (var provider in _providers)
                {
                    SqlServerTypes.Configure(provider);
                }
            }
        }
Esempio n. 4
0
        public SqlServerDataProvider(string name, SqlServerVersion version, SqlServerProvider provider)
            : base(
                name,
                MappingSchemaInstance.Get(version),
                SqlServerProviderAdapter.GetInstance(provider))
        {
            Version  = version;
            Provider = provider;

            SqlProviderFlags.IsDistinctOrderBySupported       = false;
            SqlProviderFlags.IsSubQueryOrderBySupported       = false;
            SqlProviderFlags.IsDistinctSetOperationsSupported = true;
            SqlProviderFlags.IsCountDistinctSupported         = true;
            SqlProviderFlags.IsUpdateFromSupported            = true;

            if (version == SqlServerVersion.v2000)
            {
                SqlProviderFlags.AcceptsTakeAsParameter   = false;
                SqlProviderFlags.IsSkipSupported          = false;
                SqlProviderFlags.IsCountSubQuerySupported = false;
            }
            else
            {
                SqlProviderFlags.IsApplyJoinSupported = true;
                SqlProviderFlags.TakeHintsSupported   = TakeHints.Percent | TakeHints.WithTies;
                SqlProviderFlags.IsCommonTableExpressionsSupported = version >= SqlServerVersion.v2008;
            }

            SetCharField("char", (r, i) => r.GetString(i).TrimEnd(' '));
            SetCharField("nchar", (r, i) => r.GetString(i).TrimEnd(' '));
            SetCharFieldToType <char>("char", DataTools.GetCharExpression);
            SetCharFieldToType <char>("nchar", DataTools.GetCharExpression);

            _sqlOptimizer = version switch
            {
                SqlServerVersion.v2000 => new SqlServer2000SqlOptimizer(SqlProviderFlags),
                SqlServerVersion.v2005 => new SqlServer2005SqlOptimizer(SqlProviderFlags),
                SqlServerVersion.v2012 => new SqlServer2012SqlOptimizer(SqlProviderFlags),
                SqlServerVersion.v2016 => new SqlServer2016SqlOptimizer(SqlProviderFlags),
                SqlServerVersion.v2017 => new SqlServer2017SqlOptimizer(SqlProviderFlags),
                _ => new SqlServer2008SqlOptimizer(SqlProviderFlags),
            };

            // missing:
            // GetSqlBytes
            // GetSqlChars
            SetProviderField <SqlBinary, SqlBinary>(SqlTypes.GetSqlBinaryReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlBoolean, SqlBoolean>(SqlTypes.GetSqlBooleanReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlByte, SqlByte>(SqlTypes.GetSqlByteReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlDateTime, SqlDateTime>(SqlTypes.GetSqlDateTimeReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlDecimal, SqlDecimal>(SqlTypes.GetSqlDecimalReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlDouble, SqlDouble>(SqlTypes.GetSqlDoubleReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlGuid, SqlGuid>(SqlTypes.GetSqlGuidReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlInt16, SqlInt16>(SqlTypes.GetSqlInt16ReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlInt32, SqlInt32>(SqlTypes.GetSqlInt32ReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlInt64, SqlInt64>(SqlTypes.GetSqlInt64ReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlMoney, SqlMoney>(SqlTypes.GetSqlMoneyReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlSingle, SqlSingle>(SqlTypes.GetSqlSingleReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlString, SqlString>(SqlTypes.GetSqlStringReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <SqlXml, SqlXml>(Adapter.GetSqlXmlReaderMethod, dataReaderType: Adapter.DataReaderType);

            SetProviderField <DateTimeOffset>(Adapter.GetDateTimeOffsetReaderMethod, dataReaderType: Adapter.DataReaderType);
            SetProviderField <TimeSpan>      (Adapter.GetTimeSpanReaderMethod, dataReaderType: Adapter.DataReaderType);

            // non-specific fallback
            SetProviderField <IDataReader, SqlString, SqlString>((r, i) => r.GetString(i));

            SqlServerTypes.Configure(this);
        }