C# SqlParameter DbType.Date->;SqlDbType.DateTime转换

C# SqlParameter DbType.Date->;SqlDbType.DateTime转换,c#,.net,sql-server,sqlcommand,dbcommand,C#,.net,Sql Server,Sqlcommand,Dbcommand,我正在使用泛型IDbCommand函数(在非SqlCommand帮助程序方法中)将SqlCommand.DbType设置为DbType。日期与此类似: var param = command.CreateParameter(); param.DbType = DbType.Date; param.ParameterName = field; param.Value = ToDb(val); command.Par

我正在使用泛型IDbCommand函数(在非SqlCommand帮助程序方法中)将SqlCommand.DbType设置为DbType。日期与此类似:

        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,因为列/索引是Sql Server类型的Date,而不是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之间的区别?还是有更基本的事情发生了

是否有无特殊参数的实际解决方法


(今早我在搜索中意外地发现了很少的参考文献,所以在下一轮咖啡因之前,我可能错过了一些更明显的东西?我一直很感激!)

作为参考,因为我必须自己解决这个问题:


您不需要反编译-您可以在github上看到它:。“向后兼容DbType.Date和DbType.Time的两个特殊datetime情况应该始终被视为设置DbType.datetime”非常烦人-不,我看不到一个简单的解决方法:(啊,公平点!我想这基本上回答了这个问题-MS back compat choice(我们现在需要解决)。应该知道你会得到一个立即而果断的答案,先生-格雷齐!(顺便说一句,这正是我想要的。我知道你并不渴望得到代表,但如果你把它作为一个答案发布,那就全是你的了。:)