使用参数Delphi XE7 Firedac

时间:2014-10-15 18:54:24

标签: mysql delphi firedac

这里的任何帮助都会很棒。

我正在尝试使用参数动态更改'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;

5 个答案:

答案 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://sqlmap.org/

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,那将会很精彩。