我已经看过更多的SQL问题比我关心计数,但似乎没有什么是为这个特定的问题工作。我正在使用以下代码对c#中的访问数据库运行SELECT查询:
DateTime starttime = new DateTime(2011, 9, 4);
DateTime endtime = new DateTime(2011, 9, 10);
cmd.CommandText = @"SELECT ACT_ENTRY2CASE,ACT_ENTRY2USER FROM SA_TABLE_ACT_ENTRY WHERE ENTRY_TIME>" + starttime + @" AND ENTRY_TIME<" + endtime + @" AND ACT_ENTRY2CASE IS NOT NULL";
reader = cmd.ExecuteReader();
我得到错误:
查询表达式中语法错误(缺少操作符)ENTRY_TIME>9/4/2011 12:00:00 AM和ENTRY_TIME<9/10/2011 12:00:00 AMAND ACT_ENTRY2CASE不为空'.
我试过用各种各样的东西(括号,'标记,[]等)包围我的变量。似乎没有什么能使它工作(尽管其中一些项目的错误改变为"缺少或无效的参数"的效果。
我肯定这是我的一个愚蠢的小打字错误,但我怎么也找不到。什么好主意吗?
首先,你的代码很容易受到SQL注入的攻击。
你应该参数化你的查询。这是" the codez":
cmd.CommandText = @"
SELECT ACT_ENTRY2CASE,ACT_ENTRY2USER
FROM SA_TABLE_ACT_ENTRY
WHERE ENTRY_TIME> @starttime
AND ENTRY_TIME< @endtime
AND ACT_ENTRY2CASE IS NOT NULL";
cmd.Parameters.AddWithValue("@starttime", starttime);
cmd.Parameters.AddWithValue("@endtime ", endtime );
reader = cmd.ExecuteReader();
你需要把你的开始时间和结束时间在引号内(如果你只是有一个字符串表示的日期在你的数据库)或使用To_Date() sql函数将你的日期转换为sql日期对象…
然而,最好是参数化你的sql,使其安全,并提高性能。
我不知道这是否是问题的全部,但我认为你需要在你的日期中加上引号。您可能已经尝试过了,但是错过了一个,它会给您不匹配的引号。