Parameters的动态应用

在数据库应用系统中,经常有高频查询的需求,即每次查询提取的数据结构相同,参与过滤的栏位也不变,只是每次过滤的条件值不同。这种情况下,ADOQuery1.Parameters.ParamByName(‘F1’)的性能表现最佳。

与动态修改WHERE子句 来实现过滤相比,Parameters有下列优势:

  1. 避免 SQL 解析开销:数据库会缓存参数化查询的执行计划,多次执行时无需重新解析 SQL 语法。
  2. 防止 SQL 注入:参数化查询自动处理值的转义,安全性更高。
  3. 执行防错:参数值会按指定类型传递,减少类型转换错误。

动态调整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;

发表评论