好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

c# – SqlParameter DbType.Date – > SqlDbType.Dat

我正在使用通用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的实际解决方法?

(我今天早上发现这个搜索的参考文献很少,所以也许有一些更明显的东西,我会在另一轮咖啡因之前失踪?总是很感激!)

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

Permalink (as it’s moved)

Current (as of 2018-04-11)

查看更多关于c# – SqlParameter DbType.Date – > SqlDbType.Dat的详细内容...

  阅读:47次