読者です 読者をやめる 読者になる 読者になる

SQL Server Data Type Mappings のドキュメント間違ってね?

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 でも使えるように見えるよ。。