[更新:如果我在参数中进行硬编码,查询就会起作用 - 所以它与我在查询中添加参数的方式有关]
对于我的生活,我无法弄清楚这里的问题是什么。
以下是传递给datareader的查询:
SELECT * FROM (SELECT TOP ? StartDate, [ID] FROM
(SELECT TOP ? StartDate, [ID] FROM Story
ORDER BY StartDate DESC, [ID] DESC) AS foo
ORDER BY StartDate ASC, [ID] ASC) AS bar
INNER JOIN Story AS t ON bar.ID = t.ID
ORDER BY bar.StartDate DESC, bar.[ID] DESC
参数按以下顺序添加:
var pNumToRetrieve = new OleDbParameter("", OleDbType.Integer) {Value = numToGet};
var pResultSet = new OleDbParameter("", OleDbType.Integer) {Value = resultSet};
_cmd.Parameters.Add(pNumToRetrieve);
_cmd.Parameters.Add(pResultSet);
如果我直接将此查询输入访问,它就可以正常工作。但是,从ASP.NET运行查询时,我收到以下错误:
SELECT语句包含拼写错误或缺失的保留字或参数名称,或者标点符号不正确。
我做错了什么?
谢谢,
亚当
答案 0 :(得分:6)
Jet SQL中的TOP N查询中的N无法参数化,周期。您必须动态编写SQL字符串以获取变量N.这意味着您不能使用已保存的QueryDef,或者您必须编辑QueryDef的SQL并在使用之前保存它。
答案 1 :(得分:2)
考虑使用相关子查询重写TOP N
构造。
这是一个简单的例子。考虑一个名为Sequence的表,其中列(seq)为唯一INTEGER
s(标准SQL辅助表,在无数情况下很有用 - 每个数据库应该有一个!)
以下两个查询都返回seq的两个最高值:
1)
SELECT TOP 2 seq
FROM SEQUENCE
ORDER
BY seq DESC;
优点:Access数据库引擎相对较好地执行此操作(正如您对专有语法所期望的那样)。
缺点:专有语法因此不便于移植。 N(如在TOP N中)不能参数化。对我来说,使用DESC
中的ORDER BY
返回最高值是违反直觉的。
2)
SELECT S1.seq
FROM SEQUENCE AS S1
WHERE 2 >= (
SELECT COUNT(*)
FROM SEQUENCE AS S2
WHERE S2.seq >= S1.seq
);
优点:标准SQL语法因此有利于可移植性。 N可以参数化。 缺点:Access数据库引擎不能很好地优化相关子查询,因此随着表中行数的增加,性能会下降(与性能问题一样,您需要对其进行测试)。一些SQL编码器发现相关子查询难以理解,因此存在潜在的维护问题。
答案 2 :(得分:0)
我注意到并非所有ID列都有方形括号。这可能是它,但是我已经玩了一段时间,所以其他人可能有更好的答案。
修改强>
到目前为止,你没有运气,我会尝试另一种猜测。您是否可以尝试将“*”更改为显式命名所需的列。
最终编辑:
我要提供的最后一条建议是用一个非常简单的版本替换查询,它不会产生任何结果。然后给它一个测试,如果它失败了它必须是失败的参数代码,如果没有那么它就是查询复杂性的东西。如果逐步重建查询,则应该能够检测到失败点。对不起,我无法提供更多帮助。
答案 3 :(得分:0)
是否将pResultSet参数键入为OleDbTypeInteger?
答案 4 :(得分:0)
它是否喜欢子查询中的顺序? SqlServer不支持。
编辑:我的错误,我错过了Top?
答案 5 :(得分:0)
查看以这种方式更改查询是否有帮助。
PARAMETERS numToGet number, rowsToGet numeric;
SELECT * FROM (SELECT TOP numToGet StartDate, [ID] FROM
(SELECT TOP rowsToGet StartDate, [ID] FROM Story
ORDER BY StartDate DESC, [ID] DESC) AS foo
ORDER BY StartDate ASC, [ID] ASC) AS bar
INNER JOIN Story AS t ON bar.ID = t.ID
ORDER BY bar.StartDate DESC, bar.[ID] DESC
编辑:在旁注中,使用这两个参数传递的值是多少?这两个数字都是?