如何使用 SQLQuery 组件进行 运行 多个查询?
How do you use the SQLQuery component to run multiple queries?
我有一个列表框显示数据库中单个字段 (first
) 的所有记录。当用户单击 ListBox 项目时,我希望显示数据库 (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。数据库是 sqlite3,如果重要的话,我使用的是 Lazarus 而不是 Delphi,如果重要的话。]
您需要先关闭您的查询,然后才能再次打开它。如果您查看 TDataSet 上的 Open 代码,它会将 Active 属性 设置为 true。 Active 的设置代码在做任何工作之前首先检查值是否不同:
procedure TDataSet.SetActive(Value: Boolean);
begin
..
if Active <> Value then
begin
end;
end;
因此,在您的情况下,活动 属性 已经为真,代码刚刚退出。
我有一个列表框显示数据库中单个字段 (first
) 的所有记录。当用户单击 ListBox 项目时,我希望显示数据库 (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。数据库是 sqlite3,如果重要的话,我使用的是 Lazarus 而不是 Delphi,如果重要的话。]
您需要先关闭您的查询,然后才能再次打开它。如果您查看 TDataSet 上的 Open 代码,它会将 Active 属性 设置为 true。 Active 的设置代码在做任何工作之前首先检查值是否不同:
procedure TDataSet.SetActive(Value: Boolean);
begin
..
if Active <> Value then
begin
end;
end;
因此,在您的情况下,活动 属性 已经为真,代码刚刚退出。