Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C和MS访问之间的数据类型不匹配?_C#_Datetime_Ms Access - Fatal编程技术网

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

C# C和MS访问之间的数据类型不匹配?,c#,datetime,ms-access,C#,Datetime,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, star

我有一个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);
移位表包含以下列:

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的这一点有关,即毫秒部分导致异常的原因是之前的DateTime.Now调用

有人能解决这个问题或者知道问题是什么吗

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


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

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

您可以使用前面提到的问题的答案中的方法除去毫秒,也可以将参数格式化为yyyy MM dd HH:MM:ss字符串,并让Access OLEDB将其转换回Access日期/时间值,即

cmd.Parameters。AddWithValue@profile_id,ProfileID; cmd.Parameters。AddWithValue@start,Start.Value.ToStringyyyy-MM-dd HH:MM:ss; cmd.Parameters。AddWithValue@start_log,StartLog.Value.ToStringyyyy-MM-dd HH:MM:ss;
ProfileID是否来自DB和@profile_id String?@Mark ProfileID是一个字符串实例变量,而@profile_id是OleDB的参数,也是一个字符串。听起来DB已经将Start和StartLog定义为字符串而不是日期,否则您仍然应该得到一个不匹配的传递字符串到日期col@Plutonix事实并非如此。我还仔细检查了DB表,两列都列为日期/时间;然后在两个AddWithValue语句执行后检查debug中的参数,看看这两个参数数据类型是什么,如果它们是不同的Date vs TimeSpatmp 8I think*。AddWithValue允许OleDB根据传递的数据解释数据类型。这些是来自DTP吗?这是不同地区不同时间格式的潜在陷阱吗?@YouAreSalty-恰恰相反。将日期显式格式化为yyyy-MM-dd可以使其明确无误,因此无论Windows中指定的短日期格式如何,它都可以工作。其他格式,尤其是dd-MM-yyyy,可能会导致问题,因为Access数据库引擎解释日期文字的方式。我将您的标记为答案,但我最终使用了我在原始帖子中提到的扩展方法,并更新类以始终截断到最接近的秒。省去了编辑每个实例和添加ToString的麻烦,因为我调用这些属性的地方都会被预截断。