SQL Server の Date 型に ADO.NET の DbType.Date はうまく動かない - お だ のスペース の続き
SqlParameter.cs 見てみました。
corefx/SqlParameter.cs at v1.0.4 · dotnet/corefx · GitHub
Reference Source
set { MetaType metatype = _metaType; if ((null == metatype) || (metatype.DbType != value) || // Two special datetime cases for backward compat // DbType.Date and DbType.Time should always be treated as setting DbType.DateTime instead value == DbType.Date || value == DbType.Time) { PropertyTypeChanging(); _metaType = MetaType.GetMetaTypeFromDbType(value); } }
DbType.Date と DyType.Time の場合は、下位互換のために 毎回 MetaType を更新してますと。
で MetaType.GetMetaTypeFromDbType で何してるかというと、
corefx/SqlEnums.cs at v1.0.4 · dotnet/corefx · GitHub
Reference Source
internal static MetaType GetMetaTypeFromDbType(DbType target) { // if we can't map it, we need to throw switch (target) { case DbType.AnsiString: return MetaVarChar; case DbType.AnsiStringFixedLength: return MetaChar; case DbType.Binary: return MetaVarBinary; case DbType.Byte: return MetaTinyInt; case DbType.Boolean: return MetaBit; case DbType.Currency: return MetaMoney; case DbType.Date: case DbType.DateTime: return MetaDateTime; case DbType.Decimal: return MetaDecimal; case DbType.Double: return MetaFloat; case DbType.Guid: return MetaUniqueId; case DbType.Int16: return MetaSmallInt; case DbType.Int32: return MetaInt; case DbType.Int64: return MetaBigInt; case DbType.Object: return MetaVariant; case DbType.Single: return MetaReal; case DbType.String: return MetaNVarChar; case DbType.StringFixedLength: return MetaNChar; case DbType.Time: return MetaDateTime; case DbType.Xml: return MetaXml; case DbType.DateTime2: return MetaDateTime2; case DbType.DateTimeOffset: return MetaDateTimeOffset; case DbType.SByte: // unsupported case DbType.UInt16: case DbType.UInt32: case DbType.UInt64: case DbType.VarNumeric: default: throw ADP.DbTypeNotSupported(target, typeof(SqlDbType)); // no direct mapping, error out } }
DbDate と DbTime は MetaDateTime 扱いになってますと。
で、SqlDbType 指定した場合は、
corefx/SqlEnums.cs at v1.0.4 · dotnet/corefx · GitHub
Reference Source
internal static MetaType GetMetaTypeFromSqlDbType(SqlDbType target, bool isMultiValued) { // WebData 113289 switch(target) { case SqlDbType.BigInt: return MetaBigInt; case SqlDbType.Binary: return MetaBinary; case SqlDbType.Bit: return MetaBit; case SqlDbType.Char: return MetaChar; case SqlDbType.DateTime: return MetaDateTime; case SqlDbType.Decimal: return MetaDecimal; case SqlDbType.Float: return MetaFloat; case SqlDbType.Image: return MetaImage; case SqlDbType.Int: return MetaInt; case SqlDbType.Money: return MetaMoney; case SqlDbType.NChar: return MetaNChar; case SqlDbType.NText: return MetaNText; case SqlDbType.NVarChar: return MetaNVarChar; case SqlDbType.Real: return MetaReal; case SqlDbType.UniqueIdentifier: return MetaUniqueId; case SqlDbType.SmallDateTime: return MetaSmallDateTime; case SqlDbType.SmallInt: return MetaSmallInt; case SqlDbType.SmallMoney: return MetaSmallMoney; case SqlDbType.Text: return MetaText; case SqlDbType.Timestamp: return MetaTimestamp; case SqlDbType.TinyInt: return MetaTinyInt; case SqlDbType.VarBinary: return MetaVarBinary; case SqlDbType.VarChar: return MetaVarChar; case SqlDbType.Variant: return MetaVariant; case (SqlDbType)TdsEnums.SmallVarBinary: return MetaSmallVarBinary; case SqlDbType.Xml: return MetaXml; case SqlDbType.Udt: return MetaUdt; case SqlDbType.Structured: if (isMultiValued) { return MetaTable; } else { return MetaSUDT; } case SqlDbType.Date: return MetaDate; case SqlDbType.Time: return MetaTime; case SqlDbType.DateTime2: return MetaDateTime2; case SqlDbType.DateTimeOffset: return MetaDateTimeOffset; default: throw SQL.InvalidSqlDbType(target); } }
MetaDate と MetaTime になってますね。
下位互換のために、DbType.Date と DbType.Time が SqlDbType.Date と SqlDbType.Time と動作が違うのは良いんですが、
ならドキュメントに書いといてよー。
SQL Server データ型のマッピング
日付と時刻のデータ
これ見たら、SQL Server の Date 型には、DbType.Date でも使えるように見えるよ。。