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"));
我有一个 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"));