这是我在运行下面的代码时遇到的错误。我不太清楚任何帮助是否有误
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属性中也有这个
答案 0 :(得分:1)
虽然您的问题没有说明,但我怀疑您是否尝试允许用户同时选择要在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;
答案 1 :(得分:0)
我假设并非显示所有代码,因为您似乎尝试创建动态SQL,其中" WhereFieldSelection"可以更改为组合框中显示的任何内容。如果在设置参数值后更改ADOQuery的SQL.Text属性(例如,使用" Forename"),则参数值将丢失,您必须重置它。此外,正如肯·怀特所提到的那样,Requery不是必需的。