我是 Delphi 和软件编程的新手。
我想找到一些使用
.ini
文件中的查询的建议。
我的目的是,当我首先在 DBGrid 中选择一些文件名,然后单击显示我选择的文件名的按钮,如果它们正确,则单击“确定”以使用文件名执行查询。
在这种情况下,每次选择文件名都会改变。那么,如何在
.ini
文件中执行查询以获得动态结果?
首先,这是
Queries.ini
文件中的文本:
[Query]
QSELECTEDFN=SELECT * FROM TEST_01 WHERE FILE_NAME IN (:FILE_NAME);
这是我的代码:
ini := TIniFile.Create('C:\file dir\Queries.ini');
try
qSlctdByFN := ini.ReadString('QUERY', 'QSELECTEDFN', '');
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := qSlctdByFN;
ADOQuery1.Parameters.ParamByName('FILE_NAME').Value := slselectedFN.CommaText;
ADOQuery1.Active := true;
finally
ini.Free;
end;
当我选择
1.txt
、2.txt
时,查询应该是:
SELECT * FROM TEST_01 WHERE FILE_NAME IN ('1.txt,2.txt');
当我仅选择
3.txt
时,查询应该是:
SELECT * FROM TEST_01 WHERE FILE_NAME IN ('3.txt');
您不能将 SQL 参数与
IN
子句一起使用。
TStringList
中,将其 QuoteChar
设置为单引号 ('
) 字符,然后使用 StringReplace()
来替换SQL 中的 ':FILE_NAME'
具有 TStringList.DelimitedText
值。
ini := TIniFile.Create('C:\file dir\Queries.ini');
try
qSlctdByFN := ini.ReadString('QUERY', 'QSELECTEDFN', '');
finally
ini.Free;
end;
files := TStringList.Create;
try
files.Assign(slSelectedFN);
files.QuoteChar := #39;
ADOQuery1.SQL.Text := StringReplace(qSlctdByFN, ':FILE_NAME', files.DelimitedText, []);
finally
files.Free;
end;
ADOQuery1.Active := true;