.NET 中的 IDbDataParameter 错误






2.40/5 (7投票s)
如何解决将 DateTime 赋值给 IDbDataParameter 时出现的错误。
引言
我想更新我的一个项目,该项目使用泛型、属性和反射来简化数据库访问。我最初的项目使用了像 SqlConnection
、SqlCommand
和 SqlDataReader
这样的数据库类,但为了支持更多数据库类型(MS SQL、MS MDB 和 MS SDF),我需要隔离数据库相关的代码并使用通用的接口,如 IDbConnection
、IDbCommand
和 IDataReader
。
当我将数据写回数据库时,我现在使用如下代码
IDbCommand command = connection.CreateCommand();
// ... adding each parameter like this
IDbDataParameter param = command.CreateParameter();
param.DbType = DbType.DateTime;
param.ParameterName = <Field Name>;
param.Value = DateTime.New;
command.Parameters.Add(param);
command.CommandText = <some SQL code with @-codes>;
command.Transaction = null;
command.CommandTimeout = 2000;
command.ExecuteNonQuery();
条件表达式中的数据类型不匹配
当我将 DateTime
值赋值给 param.Value
时,我得到了“条件表达式中的数据类型不匹配”异常。
在互联网上花费了一些时间后,我找到了一种解决方案,有人将 DateTime
对象转换为 string
,如下所示
param.DbType = DbType.DateTime;
param.ParameterName = <Field Name>;
param.Value = DateTime.New.ToString();
.NET Framework 中的错误
有趣的是,DateTime
赋值在我的应用程序的一个地方工作,但在其他地方却不行。在尝试了一些方法后,我发现这 .NET Framework 中的一个错误。
如果赋值的 DateTime
包含一个非 0(零)的毫秒值,则会抛出异常。如果毫秒值为 0,则不会抛出异常。
所以这段代码可以正常工作
param.Value = new DateTime(2006, 05, 04);
因为构造的 DateTime
具有 0 的毫秒值。