Delphi - 使用 sql 查询在数据库中进行组合框搜索

Delphi - combo box search in database using sql queries

这是我在 运行 下面的代码时遇到的错误。我不太确定哪里出了问题,如有任何帮助,我们将不胜感激

procedure TFSearchMember.btnSearchClick(Sender: TObject);
var buttonSelected:integer;
WhereTextSelection,WhereFieldSelection:string;
begin

WhereFieldSelection:=cboWhereField.Text;
WhereTextSelection:=txtWhere.Text;

adoQuery1.Parameters[0].Value:=WhereTextSelection;
adoQuery1.Open;
ADOQuery1.Requery;

txtWhere.Text:='';
cboWhereField.Text:='';


  if ADOQuery1.RecordCount=0 then
  begin
    buttonSelected:=MessageDlg('Record not found.', mtError, [mbOK],0);
    if buttonSelected = mrOK then
    Exit;
  end;

我在 ADOQuery 中也有这个 SQL 属性

我假设没有显示所有代码,因为您似乎试图创建动态 SQL,其中 "WhereFieldSelection" 可以更改为组合框中显示的任何内容。如果在设置参数值后更改 ADOQuery 的 SQL.Text 属性(例如使用 "Forename"),参数值将丢失,您将不得不重新设置它。另外,正如 Ken White 提到的那样,重新查询不是必需的。

虽然你的问题没有这么说,但我怀疑你试图让用户 select 在 WHERE 中使用的字段(来自 cboWhereField) 和值(来自 txtWhere)。如果是这种情况,您必须先更新 SQL,然后才能分配参数,因为两者都在变化。

这样的事情应该有效(在基本意义上):

procedure TFSearchMember.btnSearchClick(Sender: TObject);
const
  SQLBase = 'SELECT * FROM tblMembers WHERE %s = :SearchValue';
begin
  if AdoQuery1.Active then
    AdoQuery1.Close;
  AdoQuery1.SQL.Text := Format(SQLBase, [cboWhereField.Text]);
  AdoQuery1.Parameters.ParamByName('SearchValue').Value := txtWhere.Text;
  AdoQuery1.Open;

  txtWhere.Text:='';
  cboWhereField.Text:='';

  if not ADOQuery1.IsEmpty then
  begin
    // No need for if test here, as you're only offering one value.
    // MessageDlg can't return anything other than mrOK
    MessageDlg('Record not found.', mtError, [mbOk], 0);
    Exit;
  end;

  // Your other code
end;