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);

并且生成的 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/框架中继承下来的,可能 Date 不存在并且假设人们不知道 DbType.Date 和 DbType.DateTime 之间的区别是合理的?还是有更根本的事情发生?

是否有没有特殊外壳 SqlParameter 的实际解决方法?

(今天早上我发现这个搜索的参考资料出人意料地少,所以也许在另一轮咖啡因之前我错过了一些更明显的东西?总是很感激!)

4

1 回答 1

0

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

固定链接(移动时)

当前(截至 2018-04-11)

于 2018-04-11T14:50:43.050 回答