2011-07-01 33 views
1

将DateTime值作为DbParameter传递给查询时遇到问题。看起来时间部分的DateTime值被剥离了。将DateTime值作为参数传递给OleDbCommand

这里是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); 

我的问题是,日期参数似乎没有达到访问与它的一部分时间和SomeDateField总是00:00:00的时间。

我不想做这样的事情:

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

什么是数据类型数据库表中的列的列?另外你是什么意思'DbType.DateTime'不起作用? –

+0

当我使用DbType.DateTime和DbType.DateTime2时,执行命令时出现'条件表达式中的数据类型不匹配'异常。 –

+0

我使用Access作为后端,因此列数据类型是Date,但它与.NET中的DateTime等效,它也可以包含时间部分。 –

回答

0

确保您的数据类型为SomeDateFieldDateTime,而不是Date。另外,尽量使

p.DbType = DbType.DateTime; 
+0

正如我在另一条评论中所说的,我使用DateTime和DateTime2时遇到了异常。唯一有效的是Date。 –

0

当你使用OleDbType.DateTime代替DbType.Date,我敢肯定它会工作。

但是,据我所知,从你的文章中,你不想这么具体,并使用更一般的DbType枚举(和类)?

但是,我认为你应该在你的数据访问层使用更具体的OleDb类。使用较少指定的'DbType'类是没有用的,因为当你定位另一个数据库类型时,由于每个DBMS使用自己的方言,所以你的SQL语法也必须改变的机会很大。有时只是微小的变化,但仍......)。

+0

那么,我正在使用一些已经具有较少特定接口的代码,这就是我使用它们的原因。我可以改变这一点,但我认为它不应该是必要的。我会尝试使用OleDb clases,看看是否有帮助。 –