我有一个ListBox,显示数据库中单个字段(first
)的所有记录。当用户单击ListBox项时,我想要显示db(last
)中相同记录的不同字段的值。我的代码ListBox OnClick事件代码是:
SQLQuery2.SQL.Text:='SELECT * FROM Names WHERE first= :FIRST';
SQLQuery2.Params.ParamByName('FIRST').AsString := ListBox1.Items[ListBox1.ItemIndex];
SQLQuery2.Open;
ShowMessage('You selected '+SQLQuery2.FieldByName('last').AsString);
单击某个项目时,预期字段将出现在MessageBox中。但是,如果您随后单击其他项目,则不会更改任何内容 - MessageBox将显示原始字段。
我不太了解SQLQuery组件以及它们如何与底层数据库交互以了解发生了什么。
[P.S。 db是sqlite3,如果重要的话,我使用Lazarus而不是Delphi,如果这很重要的话。]
答案 0 :(得分:3)
您需要在再次打开之前关闭查询。如果查看TDataSet上的Open代码,则将Active属性设置为true。在执行任何工作之前,Active的设置代码首先检查值是否不同:
procedure TDataSet.SetActive(Value: Boolean);
begin
..
if Active <> Value then
begin
end;
end;
因此,在您的情况下,活动属性已经为真且代码刚退出。