将 DateTime 值作为参数传递给 OleDbCommand

Posted

技术标签:

【中文标题】将 DateTime 值作为参数传递给 OleDbCommand【英文标题】:Passing a DateTime value as a parameter to an OleDbCommand 【发布时间】:2011-07-01 19:09:02 【问题描述】:

我在将 DateTime 值作为 DbParameter 传递给查询时遇到问题。似乎 DateTime 值的时间部分被剥离了。

这是一个 C# 示例代码:

DbProviderFactory _factory = OleDbFactory.Instance;

DbCommand cmd = _factory.CreateCommand();
cmd.CommandText = "INSERT INTO SomeTable (SomeDateField) VALUES (?)";

DbParameter p = _factory.CreateParameter();
p.ParameterName = ""; // Not necessary
p.Value = DateTime.Now; // assume Time != 00:00:00
p.DbType = DbType.Date; // DateTime and DateTime2 don't work

cmd.Parameters.Add(p);

我的问题是 Date 参数似乎没有通过它的时间部分到达 Access 并且 SomeDateField 总是将 00:00:00 作为时间。

我不想做这样的事情:

cmd.CommandText = "INSERT INTO SomeTable (SomeDateField) VALUES (#" + aDateTimeString + "#)";

【问题讨论】:

数据库表中列的数据类型是什么?另外DbType.DateTime 不起作用是什么意思? 当我使用 DbType.DateTime 和 DbType.DateTime2 时,我在执行命令时收到“条件表达式中的数据类型不匹配”异常。 我使用Access作为后端,所以列数据类型是Date,但它相当于.NET中的DateTime,它也可以包含时间部分。 以下答案表明 DateTime 值中的毫秒数可能是一个问题:***.com/a/29207251/13087 因此,如果您想避免使用特定于提供程序的数据类型(假设此精度足以满足您的用例)。 【参考方案1】:

确保SomeDateField 的数据类型是DateTime 而不是Date。另外,尝试制作

p.DbType = DbType.DateTime;

【讨论】:

正如我在另一条评论中所说,当我使用 DateTime 和 DateTime2 时出现异常。唯一有效的是日期。【参考方案2】:

当您使用OleDbType.DateTime 而不是DbType.Date 时,我相信它会起作用。

但是,正如我从您的帖子中了解到的那样,您不想如此具体,而是使用更通用的 DbType 枚举(和类)?

但是,我认为您应该在数据访问层中使用更具体的 OleDb 类。使用较少指定的 'DbType' 类是无用的,因为当您针对另一种数据库类型时,您的 SQL 语法也必须更改的可能性很大,因为每个 DBMS 都使用自己的方言(有时只是微小的变化,但仍然......)。

【讨论】:

嗯,我正在处理一些已经暴露了不太具体的接口的代码,这就是我使用它们的原因。我可以改变它,但我认为它不应该是必要的。我会尝试使用 OleDb 类,看看是否有帮助。【参考方案3】:

OleDbType 没有 DateTime 枚举 http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbtype.aspx

如果使用 DBType.DateTime,“参数的类型特定于 .NET Framework 数据提供程序。指定类型会将 Parameter 的值转换为数据提供程序类型,然后再将值传递给数据源。如果未指定类型,ADO.NET 从 Parameter 对象的 Value 属性推断 Parameter 的数据提供者类型。" http://msdn.microsoft.com/en-us/library/system.data.dbtype.aspx

【讨论】:

以上是关于将 DateTime 值作为参数传递给 OleDbCommand的主要内容,如果未能解决你的问题,请参考以下文章

将数组中的所有值作为参数传递给函数

当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]

将状态作为参数传递给 switch

将一个函数的多个返回值作为参数传递给另一个函数

如何将 vue.js 值作为参数传递给刀片中的路由

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?