在数据库应用系统中,经常有高频查询的需求,即每次查询提取的数据结构相同,参与过滤的栏位也不变,只是每次过滤的条件值不同。这种情况下,ADOQuery1.Parameters.ParamByName(‘F1’)的性能表现最佳。
与动态修改WHERE子句 来实现过滤相比,Parameters有下列优势:
- 避免 SQL 解析开销:数据库会缓存参数化查询的执行计划,多次执行时无需重新解析 SQL 语法。
- 防止 SQL 注入:参数化查询自动处理值的转义,安全性更高。
- 执行防错:参数值会按指定类型传递,减少类型转换错误。
动态调整ADOQuery1.Parameters,严格按下述步骤开发,确保无忧:
一、在设计界面给ADOQuery1配置两个parameters:F1和F2,相比把参数写在代码中更可靠。
二、ADOQuery1的静态SQL中,不要包含参数,另外用全局变量sFixSql暂存静态SQL语句。sFixSql:=qMaster.SQL.Text;
三、实测ADOQuery1的SQL中无参数,但设计界面配置了参数,打开ADOQuery1正常!且全部显示。
四、执行查询时动态套参数的代码,qMaster是ADOQuery实例,sField1和sField2是参与过滤的两个栏位,cbbFilt1和cbbFilt2是两个下拉选择框,用户选择不同值进行查询。
procedure TfmsoChengpin.btnFindClick(Sender: TObject);
var
sValue:String;
begin
inherited;
qMaster.Close;
qMaster.Filtered:=false;
qMaster.SQL.Text:=sFixSql;
if cbbFilt1.ItemIndex > 0 then
qMaster.SQL.Text:=qMaster.SQL.Text+' and ('+sField1+' =:F1) '
else
qMaster.SQL.Text:=qMaster.SQL.Text+' and ('+sField1+' =:F1 or 1=1) ';
if cbbFilt2.ItemIndex > 0 then
qMaster.SQL.Text:=qMaster.SQL.Text+' and ('+sField2+' =:F2) '
else
qMaster.SQL.Text:=qMaster.SQL.Text+' and ('+sField2+' =:F2 or 1=1) ';
sValue:=cbbFilt1.Text;
sValue:=copy(sValue,1,pos('--',sValue)-1);
qMaster.Parameters[0].Value:=sValue;
sValue:=cbbFilt2.Text;
sValue:=copy(sValue,1,pos('--',sValue)-1);
qMaster.Parameters[1].Value:=sValue;
qMaster.Open;
end;
