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