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()); }
/// <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); } } }
/// <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); } } }
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); }