Как проверить, возвращает ли TQuery какой-либо результат в Delphi?

Я пытаюсь выяснить, есть ли запись в базе данных, я выполняю запрос select и хочу получить результат, но все еще не могу его получить ...

База данных

Выполнив следующий запрос непосредственно в базе данных:

SELECT T.ID
FROM TABLA T
WHERE ID=3

Вы получите:

No rows returned

Теперь я пытаюсь показать сообщение в Delphi о том, что запись не существует.

В форме у меня есть тип компонента TQuery с именем qValidacion, правильно подключенный к базе данных Oracle 11g.

Попытка 1

procedure TfPrueba.ButtonAceptarClick(Sender: TObject);
begin
    qValidacion.Close;
    qValidacion.SQL.Add('SELECT T.ID');
    qValidacion.SQL.Add('FROM TABLA T');
    qValidacion.SQL.Add('WHERE ID=3');
    qValidacion.Open;
    qValidacion.First;
    if qValidacion.IsEmpty then //No se como validar si el Select regresa algo, IsEmpty me muestra los registros existentes
        begin
             ShowMessage('El registro No Existe');
        end;
    qValidacion.SQL.Clear;
end;

Попытка 2

procedure TfPrueba.ButtonAceptarClick(Sender: TObject);
begin
    qValidacion.Close;
    qValidacion.SQL.Add('SELECT T.ID');
    qValidacion.SQL.Add('FROM TABLA T');
    qValidacion.SQL.Add('WHERE ID=3');
    qValidacion.Open;
    qValidacion.First;
    if (not qValidacion.Eof) then 
        begin
             ShowMessage('El registro No Existe'); //deberia mostrar el mensaje, pero no lo muestra
        end;
    qValidacion.SQL.Clear;
end;
7
задан 15.01.2016, 23:31
2 ответа

Свойство IsEmpty TDataSet возврати истинный, если набор данных пустой.

В общем, с любым составляющим потомком TDataSet это было должно функционировать:

qValidacion.Close;
qValidacion.SQL.Text := 'select t.ID from tabla t where t.id = 3';
qValidacion.Open;
if (qValidacion.IsEmpty) then
  raise Exception.Create('El registro no existe');

Сейчас, TQuery это компонент, который является частью первого слоя стандартной связи, которая пришла с Дельфи, названный Borland Датабасе Энхине (BDE), и помечен как устаревший много лет назад. Вероятно, что у драйвера oracle BDE есть недостатки (или что у него всегда были они, мне не удается помнить), и он принес линию со всеми полями в null (я помню что увидел это поведение с Firebird в каком-то моменте.

Ты можешь делать две вещи:

С BDE и драйвером, который приносит линию со стоимостью null

Если это случай, тогда, проверь, что полученная обратно стоимость не являлась недействительной, например это функционировало бы в особенном случае, который ты выдвигаешь:

qValidacion.Close;
qValidacion.SQL.Text := 'select t.ID from tabla t where t.id = 3';
qValidacion.Open;
if (qValidacion.Fields[0].IsNull) then
  raise Exception.Create('El registro no existe');

Глаз, что ты не можешь обобщать это решение, так как может быть случай, где ты вернул стоимость null линии, что, если он существует в базе данных, из-за того же самого другой выбор состоял бы в том, чтобы считать реестры, например:

qValidacion.Close;
qValidacion.SQL.Text := 'select count(t.ID) Cuenta from tabla t where t.id = 3';
qValidacion.Open;
if (qValidacion.Fields[0].AsInteger = 0) then
  raise Exception.Create('El registro no existe');

Изменись в слой современной связи на основе данных

Это истинный ответ. Даже, если ты используешь старые версии Дельфи, как Дельфи 7, ты можешь использовать DBExpress, или идеально, если у тебя есть современная версия Дельфи, настоящая рекомендация состоит в том, чтобы использовать FireDac

2
ответ дан 24.11.2019, 14:59

Другая вещь, которая была бы должна функционировать, что-то как это:

if (qValidacion.Eof) and (qValidacion.Bof) then
  // recordset vacío
  ...

Но также был бы должен функционировать IsEmpty, который ты комментируешь. Протестируй это посмотрим с этим есть больше удача.

Приветствие.

1
ответ дан 24.11.2019, 14:59