在参数化OleDbCommand中使用DateTime的异常

时间:2010-09-27 21:24:07

标签: c# ms-access datetime oledb

我正在尝试使用C#中的参数化OleDbCommand将System.DateTime插入Access数据库。但是,它会引发Data type mismatch in criteria expression例外。

这是我的代码:

string statement = "INSERT INTO Log (SCTID, LogDateTime, Type, Message, Visible)" +
    "VALUES (?, ?, ?, ?, ?);";

OleDbCommand insertCommand = new OleDbCommand(statement, connection);

// Add parameters to the command            
insertCommand.Parameters.AddWithValue("@SCTID", OleDbType.Integer).Value = SCTID;
insertCommand.Parameters.AddWithValue("@LogDateTime", OleDbType.DBTime).Value = dateTime;
insertCommand.Parameters.AddWithValue("@Type", OleDbType.Integer).Value = (int)logType;
insertCommand.Parameters.AddWithValue("@Message", OleDbType.BSTR).Value = message;
insertCommand.Parameters.AddWithValue("@Visible", OleDbType.Boolean).Value = visible;

insertCommand.ExecuteNonQuery();

当我注释掉LogDateTime行时,剩下的就行了。我的问题是,无论我使用什么用于DateTime类型,它都不起作用。我试过了:

OleDbType.Date, OleDbType.DBDate, OleDBType.DBTimeStamp, DbType.Date, DbType.DateTime, DbType.DateTime2

我也试过了:

insertCommand.Parameters.AddWithValue("@LogDateTime", dateTime);

它也不起作用。我没有读过Google或SO的作品。另外,请注意我确实需要日期和时间,而不仅仅是日期。

1 个答案:

答案 0 :(得分:3)

insertCommand.Parameters.AddWithValue("@SCTID", OleDbType.Integer).Value = SCTID;
...

使用AddWithValue这是一种非常奇怪的方式。它的第二个参数不是类型 - 它是你想要的值。如上所述,您最终使用枚举成员OleDbType.Integer的整数值,然后通过分配Value属性立即覆盖它。应该是:

insertCommand.Parameters.AddWithValue("@SCTID", SCTID);

或:

insertCommand.Parameters.Add("@SCTID", OleDbType.Integer).Value = SCTID;

关于语句本身 - 为什么在命令文本中使用?作为占位符,但在向集合添加参数时使用名称?

关于实际问题 - 看起来像是known bug,解决方法是在分配前截断DateTime值中的毫秒数,并使用OleDbType.Date