SqlParameter DbType.Date -> Преобразование SqlDbType.DateTime

Я использую общие функции IDbCommand (в вспомогательных методах, отличных от SqlCommand), чтобы установить для SqlCommand.DbType значение DbType.Date, подобное этому:

        var param = command.CreateParameter();

        param.DbType = DbType.Date;
        param.ParameterName = field;
        param.Value = ToDb(val);

        command.Parameters.Add(param);

И результирующий параметр param.DbType переопределяется на DbType.DateTime. (Я намеренно хочу SqlDbType.Date, так как столбец/индекс имеет тип Date сервера Sql, а не DateTime.) Конечно, когда я декомпилирую, я вижу, что набор SqlParameter.DbType вызывает MetaType.GetMetaTypeFromDbType, который имеет это:

internal static MetaType GetMetaTypeFromDbType(DbType target)
{
  switch (target)
  {
    ... 

    case DbType.Date:
    case DbType.DateTime:
      return MetaType.MetaDateTime;
  }
}

Таким образом, принудительное преобразование является преднамеренным, и вместо этого я должен сделать что-то хакерское, например:

        var param = command.CreateParameter();

        var sqlParam = param as SqlParameter;
        if (sqlParam != null)
        {
            sqlParam.SqlDbType = SqlDbType.Date;
        }
        else
        {
            param.DbType = DbType.Date;
        }

        param.ParameterName = field;
        param.Value = ToDb(val);

        command.Parameters.Add(param);

Мой вопрос: почему принудительное преобразование? Является ли это переносом из более ранних версий Sql Server/framework, где, возможно, Date не существовало, и было разумно предположить, что люди не будут знать разницу между DbType.Date и DbType.DateTime? Или происходит что-то более фундаментальное?

Есть ли реальный обходной путь без специального корпуса SqlParameter?

(Сегодня утром я нашел на удивление мало ссылок, так что, возможно, есть что-то гораздо более очевидное, что я просто упускаю перед очередной порцией кофеина? Всегда ценю!)


person Gene    schedule 06.01.2017    source источник
comment
Вам не нужно декомпилировать — вы можете увидеть это на github: github.com/dotnet/corefx/blob/master/src/System.Data.SqlClient/. Два особых случая даты и времени для обратной совместимости DbType.Date и DbType.Time всегда должны рассматриваться как установка DbType.DateTime вместо этого Довольно раздражает - и нет, я не вижу простого обходного пути :(   -  person Jon Skeet    schedule 06.01.2017
comment
Ах, справедливое замечание! И я думаю, что это в значительной степени отвечает на него - выбор обратной совместимости с MS (теперь нам нужно обойти это). Должен был знать, что у вас будет немедленный и решительный ответ, сэр - grazie!   -  person Gene    schedule 06.01.2017
comment
(Кстати, это почти то, что я искал. Знайте, что вы вряд ли нуждаетесь в репутации, но если вы опубликуете как ответ, это все ваше. :))   -  person Gene    schedule 06.01.2017


Ответы (1)


Для справки, так как мне просто пришлось обойти это самому:

Постоянная ссылка (как она была перемещена)

Текущий (на 11.04.2018)

person Malcolm    schedule 11.04.2018