我正在尝试使用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的作品。另外,请注意我确实需要日期和时间,而不仅仅是日期。
答案 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
。