SqlParameter DbType.Date -> SqlDbType.DateTime 转换

5
我正在使用通用的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);

结果参数的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;
  }
}

所以强制转换是有意的,而我必须做一些hacky的事情,例如:
        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?
今天早上我搜索了很少的参考资料,也许我只是漏掉了更明显的东西,需要再来一轮咖啡因刺激?总是感激不尽!

啊,说的有道理!我想这基本上回答了问题——微软的背向兼容选择(现在我们需要解决)。我应该知道您会给出一个即时而明确的答案,谢谢您! - Gene
1
顺便说一下,那几乎就是我在寻找的。知道你不缺声望,但如果你将其发布为答案,那就归你所有了。 :) - Gene
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接