0

我有一个在 C# 应用程序中运行的以下 SQL 查询。我使用在访问中创建的本地(无服务器)数据库:

string query = @"SELECT s.TagID, se.SessionID, '" +
DateTime.Now.ToString("MM/dd/yy HH:mm:ss tt") +
"' AS ScanningTime " +
" FROM (((Student s " +
" LEFT JOIN [CourseID-ModuleID] cm ON s.CourseID = cm.CourseID) " +
" LEFT JOIN [ModuleID-SessionID] ms ON ms.ModuleID = cm.ModuleID) " +
" LEFT JOIN [Session] se ON ms.SessionID = se.SessionID) " +
" WHERE s.TagID = @tagNo " +
" AND se.SessionDate = Date() " +
" AND DateAdd('n', -30, [SessionTimeStart]) < @timeNow   " +
" AND se.SessionTimeEnd > @Plus30Min ";

查询中使用的参数和变量:

        DateTime TimePlus = DateTime.Now.AddMinutes(30);
        DateTime now = DateTime.Now;

        string Plus30Min = TimePlus.ToString("hh:mm tt");
        string timeNow = now.ToString("hh:mm tt");

        command.Parameters.Add("tagNo", OleDbType.Integer).Value = tagNo;
        command.Parameters.Add("Plus30Min", OleDbType.VarChar).Value = Plus30Min;
        command.Parameters.Add("timeNow", OleDbType.VarChar).Value = timeNow;

目前,此查询运行,但不产生任何结果。但是,如果我删除该行:

" AND DateAdd('n', -30, [SessionTimeStart]) < @timeNow   " +

然后查询完美运行。这意味着查询中的这一行一定有问题。你能在某个地方看到它吗?我查看了多个网站以获取日期查询条件的示例,但找不到错误,也许您可​​以提供帮助。提前致谢。

我唯一注意到的是围绕 n 的 ' 符号。我应该改用引号吗?如果是这样,我怎样才能在引号内实现它?

4

1 回答 1

0

将您的呼叫代码更改为

 DateTime now = DateTime.Now.AddMinutes(30);

并将查询文本中的违规行替换为

" AND SessionTimeStart > @timeNow   "

如果您在代码中的某处需要 DateTime.Now,您可以轻松地再次从同一个表达式中获得。但是,我对您的参数感到有些困惑。它们适用于日期/时间字段,但您传递字符串。如果上述解决方案不起作用,请尝试将 OleDbType.VarChar 更改为 OleDbType.DBTime 或 DbDate

EDIT 注意参数顺序。您正在使用 OleDB 并且参数的名称没有意义。您应该按照它们在查询文本中出现的完全相同的顺序将参数插入到参数集合中。@timenow 和 Plus30Min 的位置应该改变。
您的查询结束以使用 timenow 参数来测试 SessioneEndTime ,反之亦然

  command.Parameters.Add("tagNo", OleDbType.Integer).Value = tagNo;
  command.Parameters.Add("timeNow", OleDbType.VarChar).Value = timeNow;
  command.Parameters.Add("Plus30Min", OleDbType.VarChar).Value = Plus30Min;
于 2013-05-11T13:23:44.587 回答