SqlParameter DbType.Date-> SqlDbType.DateTime转换

Gen*_*ene 5 .net c# sql-server sqlcommand dbcommand

我正在使用通用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);
Run Code Online (Sandbox Code Playgroud)

并将生成的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;
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,强制转换是有意的,相反,我必须做一些骇人听闻的事情,例如:

        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);
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么要强制转换?这是从早期版本的Sql Server / framework继承而来的,在早期版本中也许不存在Date,并且可以合理地假设人们不知道DbType.Date和DbType.DateTime之间的区别?还是发生了一些更根本的事情?

没有没有特殊大小写SqlParameter的实际解决方法?

(今天早上搜索时,我发现很少有参考文献,所以也许在另一轮咖啡因之前我只是缺少了一些明显的东西?总是感谢!)

Mal*_*olm 0

仅供参考,因为我只需要自己解决这个问题:

固定链接(已移动)

当前(截至2018-04-11)