Как вы используете компонент SQLQuery для выполнения нескольких запросов?

У меня есть ListBox, показывающий все записи для одного поля (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, если это имеет значение.]


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 в TDataSet, он устанавливает для свойства Active значение true. Код настройки для Active сначала проверяет, что значение отличается, прежде чем выполнять какие-либо действия:

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

Итак, в вашем случае активное свойство уже истинно, и код просто выходит.

person Graymatter    schedule 13.03.2015