C# 和 MS Access 之间的数据类型不匹配?

DataType mismatch between C# and MS Access?

我有一个 SQL 语句在 MS Access 数据库上导致 C# 中的错误,该数据库似乎间歇性工作。我想我找到了问题所在,但不明白答案或没有解决方案。

我在C#中的SQL语句是这样写的:

// note that Start and StartLog are both nullable variables and ProfileID variable is a string

cmd = new OleDbCommand("INSERT INTO shifts(profile_id, start, start_log) " +
                "VALUES (@profile_id, @start, @start_log);");
cmd.Parameters.AddWithValue("@profile_id", ProfileID);
cmd.Parameters.AddWithValue("@start", Start.Value);
cmd.Parameters.AddWithValue("@start_log", StartLog.Value);

shifts table 有以下列:

profile_id is a string
start is a date/time
start_log is a date_time

我尝试使用从调试器中提取的以下数据执行该语句:

profile_id -> "16078965744"
start -> {1/10/2015 1:30:00 PM}
start_log -> {1/10/2015 1:23:13 PM}

并得到以下异常:

System.DataOleDb.OleDbException: {"Data type mismatch in criteria expression."}

我注意到,如果我按如下方式在 Start.Value 和 StartLog.Value 上调用 ToString(),它会起作用:

cmd = new OleDbCommand("INSERT INTO shifts(profile_id, start, start_log) " +
                "VALUES (@profile_id, @start, @start_log);");
cmd.Parameters.AddWithValue("@profile_id", ProfileID);
cmd.Parameters.AddWithValue("@start", Start.Value.ToString());
cmd.Parameters.AddWithValue("@start_log", StartLog.Value.ToString());

我怀疑这个问题与 Steve 的这个 SO answer 有关,毫秒部分是通过先前调用 DateTime.Now.

引起的异常

有人对此有解决方案或知道问题出在哪里吗?

我怀疑 this 会解决我的问题,但坦率地说,我是初学者,我对整个考验感到困惑。

这个问题源于我正在调查的未解决的问题here

是的,如果您从先前在 .NET 中对 DateTime.Now 的调用中导出参数值,几乎可以肯定是毫秒导致了问题。

您可以使用您引用的上一个问题 here 的答案中的方法摆脱毫秒,或者您可以将参数格式化为 yyyy-MM-dd HH:mm:ss 字符串并让 Access OLEDB 转换它们回到访问 Date/Time 值,即

cmd.Parameters.AddWithValue("@profile_id", ProfileID);
cmd.Parameters.AddWithValue("@start", Start.Value.ToString("yyyy-MM-dd HH:mm:ss"));
cmd.Parameters.AddWithValue("@start_log", StartLog.Value.ToString("yyyy-MM-dd HH:mm:ss"));