我有一条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答案有关,即毫秒部分是通过更早调用DateTime.Now引起异常的。
有人对此有解决方案或知道问题在哪里吗?
我怀疑这会解决我的问题,但坦率地说,我是一个初学者,整个磨难使我感到困惑。
这个问题就这个问题出在这里是没有得到解决,我调查。
是的,如果您从DateTime.Now
.NET的早期调用中派生了参数值,几乎可以肯定是毫秒导致问题的原因。
您可以使用在此处引用的上一个问题的答案中的方法来消除毫秒数,也可以将参数格式化为yyyy-MM-dd HH:mm:ss
字符串,然后让Access OLEDB将其转换回AccessDate/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"));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句