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