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) ||
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) {
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:
case DbType.UInt16:
case DbType.UInt32:
case DbType.UInt64:
case DbType.VarNumeric:
default: throw ADP.DbTypeNotSupported(target, typeof(SqlDbType));
}
}
DbDate と DbTime は MetaDateTime 扱いになってますと。
で、SqlDbType 指定した場合は、
corefx/SqlEnums.cs at v1.0.4 · dotnet/corefx · GitHub
Reference Source
internal static MetaType GetMetaTypeFromSqlDbType(SqlDbType target, bool isMultiValued) {
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 でも使えるように見えるよ。。