使用参数Delphi XE7 Firedac

Eis*_*man 4 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;
Run Code Online (Sandbox Code Playgroud)

Sir*_*ufo 8

您没有引用显示的异常消息.这是原始邮件

[FireDAC] [Phys] [MySQL]您的SQL语法错误... ''ORDER BY some_field''在第4行附近.

与你的引用相比

[FIREDAC] [PHYS] [MYSQL]你的SQL语法错误... "ORDER BY some_field"在第4行附近


为了避免将来出现这种情况,只需按下聚焦异常窗口上的CTRL+ C,完整的消息就会出现在剪贴板内,可以粘贴到任何你喜欢的地方


现在阅读这个,错误现在非常清楚.

你希望得到这样的声明

SELECT *
FROM my_table
LIMIT 1000
ORDER BY some_field
Run Code Online (Sandbox Code Playgroud)

但是使用该参数,您将获得以下声明

SELECT *
FROM my_table
LIMIT 1000
'ORDER BY some_field'
Run Code Online (Sandbox Code Playgroud)

这正是异常消息告诉你的.

只需使用上一个语句检查异常消息即可

......靠近'ORDER BY some_field'第4行.

......靠近''ORDER BY some_field''第4行.

作为结论,不可能使用参数更改语句本身.您只能将值作为语句的参数传递.

无论如何,正确的陈述应该是正确的

SELECT *
FROM my_table
ORDER BY some_field
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

  • 你应该使用参数来获得更好的性能,**以防止[sql-injection](http://en.wikipedia.org/wiki/SQL_injection)**.但这正是你想要做的,使用参数注入sql-code. (2认同)

fdu*_*nas 8

不知道这是否有帮助.但是你可以使用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;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助