我正在使用通用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的实际解决方法?
(我发现今天早上很少有人提到这个搜索,所以也许有更明显的事情我会在另一轮咖啡因之前失踪?总是很感激!)