这里的任何帮助都会很棒。
我正在尝试使用参数动态更改'ORDER BY'
下面是我尝试过的代码,但是尽管遵循了文档,我仍然收到错误'[FIREDAC] [PHYS] [MYSQL]你的SQL语法错误了...在第4行的“ORDER BY some_field”附近“
我已将ParamCreate设置为True
我的数据库是MySQL
FDQuery1.Close;
FDQuery1.SQL.Clear;
FDQuery1.SQL.Add('SELECT *');
FDQuery1.SQL.Add('FROM my_table');
FDQuery1.SQL.Add('LIMIT 1000');
FDQuery1.SQL.Add(':id');
FDQuery1.ParamByName('id').AsString := 'ORDER BY some_field';
FDQuery1.Open;
答案 0 :(得分:8)
您没有引用显示的异常消息。这是原始消息
[FireDAC] [Phys] [MySQL]您的SQL语法错误...第4行
''ORDER BY some_field''
附近。
与你的引用比较
[FIREDAC] [PHYS] [MYSQL]您的SQL语法错误...第4行
"ORDER BY some_field"
附近
为了避免将来出现这种情况,只需在焦点异常窗口中按 CTRL + C ,完整的消息就会出现在剪贴板内,可以粘贴到任何地方像
现在读到这个,错误现在非常清楚。
您希望得到这样的声明
SELECT *
FROM my_table
LIMIT 1000
ORDER BY some_field
但是使用该参数,您将获得以下声明
SELECT *
FROM my_table
LIMIT 1000
'ORDER BY some_field'
这正是异常消息告诉你的。
只需使用上一个语句检查异常消息
...在第4行
'ORDER BY some_field'
附近。
和
...在第4行
''ORDER BY some_field''
附近。
作为结论,不可能使用参数更改语句本身。您只能将值作为语句的参数传递。
无论如何应该是正确的陈述
SELECT *
FROM my_table
ORDER BY some_field
LIMIT 1000
答案 1 :(得分:8)
不知道这是否有帮助。 但你可以使用' Macros' TFDQuery的属性,比如由':'标识的参数,宏被标识为'!',您还可以组合宏和参数。 Macros属性几乎与Params属性一样。使用TFDQuery.MacroByname分配宏值,并使用TFDQuery.MacroByname(' MacroName')。AsRaw分配字符串As-Is。
所以你的查询应该是这样的:
FDQuery1.Close;
FDQuery1.SQL.Text := 'SELECT * FROM !TABLE_NAME !WHERE_CLAUSE !ORDERBY_CLAUSE';
FDQuery.MacroByname('Table_name').AsRaw := 'my_table';
FDQuery.MacroByname('Where_clause').AsRaw := 'WHERE field1 = :ID_Value';
FDQuery.MacroByname('OrderBy_clause').AsRaw := 'ORDER BY field1';
FDQuery.ParamByname('ID_Value').AsInteger := 1;
FDQuery1.Open;
希望这有帮助
答案 2 :(得分:3)
您需要非常简单的SQL查询:
FDQuery1.Close;
FDQuery1.SQL.Text := 'SELECT * FROM my_table';
FDQuery1.Open;
要设置记录计数的限制,您可以使用FDQuery1的属性:
FDQuery1.FetchOptions.RecsMax := 1000;
要对值进行排序,您可以使用
FDQuery1.IndexFieldNames = 'field_name'
或
FDQuery1.IndexFieldNames = 'field_one_name;field_two_name'
而不是你的代码。
答案 3 :(得分:2)
编辑:哦,我实际上没有回答你的问题。因此,对于FireDac,您只需将FDQuery1.IndexFieldNames
属性设置为您要订购的字段的名称即可。无需关闭并重新打开查询,也无需更改SQL。
上一个回答:您无法在参数中传递SQL代码[编辑:包括ORDER BY等],只能传递参数值,即整数,字符串等。 这个原则非常重要,否则你可以通过例如。
FDQuery1.ParamByName('id').AsString := '; TRUNCATE TABLE my_table';
然后执行查询将删除表中的所有内容,而不是执行它应该执行的操作。或者通过更多工作,您的相同查询可以返回密码,信用卡号或数据库中的任何其他内容。这可能是一个巨大的漏洞,被称为SQL注入。请参阅例如:
http://www.w3schools.com/sql/sql_injection.asp
http://hackaday.com/2014/09/01/gaining-access-to-the-oculus-developer-database
答案 4 :(得分:1)
RXLIB具有此功能。它有MACRO选项,您可以在其中编写如下代码:
选择%fields_ 来自%table_ %condition_的地方 按%order _
排序但这仅限于使用qith BDE。
如果有人重写代码以使用ADO ou FIREDAC,那将会很精彩。