4

ここでの支援は素晴らしいでしょう。

パラメータを使用して「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;
4

5 に答える 5

8

これが役立つかどうかはわかりません。ただし、「:」で識別されるパラメータのように、TFDQuery の「マクロ」プロパティを使用できます。マクロは「!」で識別されます。マクロとパラメータを組み合わせることもできます。Macros プロパティは、Params プロパティとほとんど同じように機能します。TFDQuery.MacroByname を使用してマクロ値を割り当て、TFDQuery.MacroByname('MacroName').AsRaw を使用して文字列をそのまま割り当てます。

したがって、クエリは次のようになります。

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;

お役に立てれば

于 2015-02-23T19:58:41.193 に答える
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'

あなたのコードの代わりに。

于 2014-11-20T14:11:31.317 に答える
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

于 2015-01-14T18:14:53.203 に答える
1

RXLIB にはこの機能があります。MACRO オプションがあり、次のようなコードを記述できます。

%table_ から %fields_ を選択します。ここで、%condition_ は %order_ で並べ替えられます

ただし、BDE でのみ使用できます。

誰かが ADO​​ や FIREDAC で動作するようにコードを書き直してくれたら素晴らしいでしょう。

于 2014-11-19T11:12:41.980 に答える