C# 数据库日期/时间比较未产生预期结果?

C# 数据库日期/时间比较未产生预期结果?,c#,.net,ms-access,oledb,C#,.net,Ms Access,Oledb,我在C#和MS Access中遇到问题,我希望以下调用返回一条记录: c = Shift.Get(ProfileID, Start, null, null, null, null, null, null); 其中开始时间为“2015年7月1日下午3:30:00”,ProfileID为“******16732”,方法为: public static ObservableCollection<Shift> Get(string profileID, DateTime? st

我在C#和MS Access中遇到问题,我希望以下调用返回一条记录:

   c = Shift.Get(ProfileID, Start, null, null, null, null, null, null);
其中开始时间为“2015年7月1日下午3:30:00”,ProfileID为“******16732”,方法为:

   public static ObservableCollection<Shift> Get(string profileID, DateTime? start,
         DateTime? stop, string fullName, bool? closed, bool? archived = null,
         Database db = null, string sort="ASC")
    {
        OleDbCommand cmd = new OleDbCommand(
            "SELECT profiles.profile_id, profiles.full_name, shifts.start, " +
            "shifts.stop, shifts.start_log, shifts.stop_log, shifts.notes, " +
            "shifts.closed, shifts.archived FROM shifts, profiles WHERE " +
            (profileID != null ? "(shifts.profile_id=@profile_id) AND " : "") +
            (start.HasValue ? "(shifts.start>=@start) AND " : "") +
            (stop.HasValue ? "(shifts.stop<=@stop) AND " : "") +
            (fullName != null ? "profiles.full_name=@full_name AND " : "") +
            (closed.HasValue ? "shifts.closed=@closed AND " : "") +
            (archived.HasValue ? "shifts.archived=@archived AND " : "") +
            "(shifts.profile_id=profiles.profile_id) " +
            "ORDER BY shifts.start " + sort 
            );

        if (profileID != null)
            cmd.Parameters.AddWithValue("@profile_id", profileID);

        if (start.HasValue)
            cmd.Parameters.AddWithValue("@start", start.Value.ToString());

        if (stop.HasValue)
            cmd.Parameters.AddWithValue("@stop", stop.Value.ToString());

        if (fullName != null)
            cmd.Parameters.AddWithValue("@full_name", fullName);

        if (closed.HasValue)
            cmd.Parameters.AddWithValue("@closed", closed.Value);

        if (archived.HasValue)
            cmd.Parameters.AddWithValue("@archived", archived.Value);
        ....
        }
但是,我得到的结果是没有记录,也没有错误。这是令人惊讶的,因为我在SQL语句的WHERE子句中有一个
shifts.start>=@start
,并且数据存在

注意,ProfileID是模糊的,因为它是敏感的,并且开始日期开始于停止日期之后,这显然是错误的,但这是测试数据,应该与结果没有关系。如果未提供db,则存在默认数据库连接

我不得不做一些编辑,希望我没有在任何地方打字错误


有什么线索吗?

您需要将DateTime作为DateTime对象而不是字符串传递(删除.ToString()。
这样,命令将正确解析DateTime对象,以便Access将其识别为DateTime。

为什么在添加参数时要将日期转换为字符串?在msaccess中使用带有DateTime的查询时,需要将日期放在#符号内,如下所示:where date=#07/01/2015 03:30:00#@MarkPM无特殊原因,但我看到没有calling
ToString()
也可以使用,可能是首选。将更改为这种情况。@TomerKlein使用参数化查询添加井号会导致OLEDBEException。如果从it@MarkPM我已经删除了ToString(),它工作得很好。我想知道它是在内部调用ToString()还是“it”识别DateTime并自动获取正确的dateformat,而不考虑本地?我应该在前面说明,这样做似乎有效并且不会产生错误,但不返回记录的原始行为仍然存在。我直接从调试器中复制了值作为
{1/7/2015 3:30:00 PM}
所以我相信是这样的……我收回这一点,这不起作用,并导致标准表达式中的数据类型不匹配。不确定为什么它在早些时候似乎起作用,但我确认它不起作用。开始是班次表的日期时间类型吗?是的,MS Access中
班次
表中的
开始
列是日期/时间类型E
profile_id  start               stop                    start_log           stop_log                notes   closed  archived
******45544 1/7/2015 3:30:00 PM 1/2/2015 11:30:00 PM    1/7/2015 3:06:02 PM 1/2/2015 11:32:40 PM    ""  Yes No
******12956 1/7/2015 3:30:00 PM 1/2/2015 9:00:00 PM     1/7/2015 3:08:10 PM 1/2/2015 9:15:29 PM   ""    Yes No
******17392 1/7/2015 2:00:00 PM 1/2/2015 11:30:00 PM    1/7/2015 1:46:07 PM 1/2/2015 11:33:09 PM    ""  Yes No
******16732 1/7/2015 3:30:00 PM 1/2/2015 6:30:00 PM     1/7/2015 3:08:38 PM 1/2/2015 6:35:03 PM   ""    Yes No
******15503 1/7/2015 2:00:00 PM 1/2/2015 10:00:00 PM    1/7/2015 1:46:43 PM 1/2/2015 10:01:24 PM    ""  Yes No
******14536 1/7/2015 3:30:00 PM 1/2/2015 11:30:00 PM    1/7/2015 3:04:12 PM 1/2/2015 11:35:19 PM    ""  Yes No