Как използвате компонента SQLQuery за изпълнение на множество заявки?

Имам 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 показва оригиналното поле.

Не знам достатъчно за компонентите на SQLQuery и как те взаимодействат с основната база данни, за да знам какво се случва.

[P.S. Базата данни е sqlite3, ако това има значение, и използвам Lazarus, а не Delphi, ако това има значение.]


person Al C    schedule 13.03.2015    source източник
comment
Затваряте ли заявката, преди да опитате отново?   -  person Graymatter    schedule 14.03.2015
comment
@Graymatter--Не, не знаех, че трябва. Просто го опитах; всичко работи ОК. Ако поставите това като отговор (може би с малко обяснение защо трябва да го направя? Аз съм начинаещ.) Мога да го приема като отговор ... Благодаря!   -  person Al C    schedule 14.03.2015
comment
Обикновено всичко, което може да бъде opened, може да бъде и closed.   -  person Jerry Dodge    schedule 14.03.2015
comment
Благодаря, Джери :-) ... Просто се чудех защо нещо отворено трябва да се затваря и отваря отново?   -  person Al C    schedule 14.03.2015


Отговори (1)


Трябва да затворите заявката си, преди да я отворите отново. Ако погледнете кода за Open on TDataSet, той задава свойството Active на true. Кодът за настройка за Active първо проверява дали стойността е различна, преди да извърши каквато и да е работа:

procedure TDataSet.SetActive(Value: Boolean);
begin
  ..
    if Active <> Value then
    begin
    end;
end;

Така че във вашия случай активното свойство вече е вярно и кодът просто излиза.

person Graymatter    schedule 13.03.2015