我有一个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
表格包含以下列:
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。
答案 0 :(得分:0)
是的,如果您从.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"));