我在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 " +
然后查询运行完美。这意味着查询中的这一行肯定有问题。你能在某个地方看到它吗?我查看了多个网站的日期查询标准示例,但我找不到错误,也许您可以提供帮助。提前谢谢。
我唯一注意到的是'周围的标志'。我应该使用引号吗?如果是这样,我怎样才能在引号内实现它?
答案 0 :(得分:0)
将您的主叫代码更改为
DateTime now = DateTime.Now.AddMinutes(30);
并用
替换查询文本中的违规行" AND SessionTimeStart > @timeNow "
如果您需要在代码中的某个位置使用DateTime.Now,则可以轻松地从同一表达式中获取。但是,我对你的参数感到有点困惑。它们对日期/时间字段起作用,但您传递字符串。如果上述解决方案不起作用,请尝试将OleDbType.VarChar更改为OleDbType.DBTime或DbDate
编辑请注意参数顺序。您正在使用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;