Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос ничего не вернул, Как определить? 
:(
    Опции темы
fess
Дата 28.3.2005, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



Я где-то затупил...
Работаю с Paradox через BDE.

Использую компонент TQuery для создания и выполнения запроса. Затем этот TQuery подсоединяю к TDataSet, через который осуществляю доступ к результату запроса.

Как мне определить, что запрос Select ничего не вернул?

Пробовал:
0. SomeDataSet.DataSet.EOF
1. SomeDataSet.DataSet.RecordCount (значение равно единице, даже если запрос ничего не вернул).
2. SomeDataSet.DataSet.RecordSize=0 (никогда не равно нулю)
3. Считывать данные по полям и проверять их на nil - тоже ничего не получилось.

Наверняка есть какое-то свойство у TDataSet или у TQuery, которое позволяет определить это, но я его не нешёл smile smile
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Alex
Дата 28.3.2005, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Код

if Query.Fields[0].IsNull then // Запрос ничего не вернул



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Петрович
Дата 28.3.2005, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 6
Всего: 55



Цитата(Alex @ 28.3.2005, 23:49)
1:

if Query.Fields[0].IsNull then // Запрос ничего не вернул

Это не хорошо.
В первом поле первой записи не пустого множества записей вполне иожет быть Null.
Правильнее будет так:
Код

if Query.IsEmpty then // Запрос ничего не вернул

smile


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Alex
Дата 28.3.2005, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



smile


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
fess
Дата 29.3.2005, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



Цитата
Код

if Query.IsEmpty then // Запрос ничего не вернул

Не срабатывает! Я пишу этот код после Query.Open (всегда возвращает false), если после Query.ExecSql, то всегда - true.
В чём прикол? Может, в другом месте надо писать?

Цитата

Код

if Query.Fields[0].IsNull then // Запрос ничего не вернул


Это работает (спасибо,Alex), но я согласен с Петровичем, что это не совсем корректно.

--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Alex
Дата 29.3.2005, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



fess, Мой код очень не корректный. Покажи свой код или выложи проект, если он не большой. Код Петровича должен работать.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Петрович
Дата 29.3.2005, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 6
Всего: 55



Цитата(fess @ 29.3.2005, 10:44)
Цитата
Код Pascal/Delphi
if Query.IsEmpty then // Запрос ничего не вернул
Не срабатывает! Я пишу этот код после Query.Open (всегда возвращает false), если после Query.ExecSql, то всегда - true.
В чём прикол? Может, в другом месте надо писать?

Прикол наверное в твоем коде. smile
Вот тебе пример:
Код

procedure TTestForm.Button1Click(Sender: TObject);
var  q :TQuery;
begin //
  q := TQuery.Create(Self);
  try
    q.DatabaseName := 'DBDEMOS';

    // эксперимент 0 - нет записей
    q.SQL.Text := 'SELECT * FROM country.db WHERE name = ''Petrovich Kingdom''';
    q.Open;
    if  q.IsEmpty  then
      Log('0 нет записей')
    else
      Log('0 есть записи')
    ;
    q.Close;

    // эксперимент 1 - одна запись
    q.SQL.Text := 'SELECT * FROM country.db WHERE name = ''Canada''';
    q.Open;
    if  q.IsEmpty  then
      Log('1 нет записей')
    else
      Log('1 есть записи')
    ;
    q.Close;

    // эксперимент 2 - много записей
    q.SQL.Text := 'SELECT * FROM country.db';
    q.Open;
    if  q.IsEmpty  then
      Log('2 нет записей')
    else
      Log('2 есть записи')
    ;
    q.Close;

  finally
    q.Free;
  end;
end;

Так вот, лично у меня он пишет следующее:
Цитата
0 нет записей
1 есть записи
2 есть записи


Это сообщение отредактировал(а) Петрович - 29.3.2005, 11:59


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
fess
Дата 29.3.2005, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



Петрович - код работает, но не на всех запросах (хотя странно).
Например, если добавить сумму и групировку (как в моём запросе), то это перестаёт работать.
Вот изменённый код:

Код

procedure TTestForm.Button1Click(Sender: TObject);
var  q :TQuery;
begin //
  q := TQuery.Create(Self);
  try
    q.DatabaseName := 'DBDEMOS';
    // эксперимент 0 - нет записей
    q.SQL.Text :='SELECT Sum(Area), name FROM country.db WHERE Continent = ''Petrovich Kingdom'' Group By name';
    q.Open;
    if  q.IsEmpty  then
      Log('0 нет записей')
    else
      Log('0 есть записи')
    ;
    q.Close;
    // эксперимент 1 - одна запись
    q.SQL.Text := 'SELECT * FROM country.db WHERE name = ''Canada''';
    q.Open;
    if  q.IsEmpty  then
      Log('1 нет записей')
    else
      Log('1 есть записи')
    ;
    q.Close;
    // эксперимент 2 - много записей
    q.SQL.Text := 'SELECT * FROM country.db';
    q.Open;
    if  q.IsEmpty  then
      Log('2 нет записей')
    else
      Log('2 есть записи')
    ;
    q.Close;
  finally
    q.Free;
  end;
end;


После этого лог выглядит следующим образом:

Цитата
0 есть записи
1 есть записи
2 есть записи


Где может быть ошибка?
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Alex
Дата 29.3.2005, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Если в запросе имеются агригативные функции, то он по определению всегда возвращает результат. Т.к. функция возвращает результат.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
fess
Дата 29.3.2005, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



Цитата
Если в запросе имеются агригативные функции, то он по определению всегда возвращает результат. Т.к. функция возвращает результат.

И чего делать в это случае?
Если подсоединить всё это к DBGrid'у, то там будет пустая строка без каких-либо данных.
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Alex
Дата 29.3.2005, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Цитата(fess @ 29.3.2005, 17:33)
И чего делать в это случае?
Если подсоединить всё это к DBGrid'у, то там будет пустая строка без каких-либо данных.

Здесь тогда насколько я понимаю нужно только на null проверять.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Петрович
Дата 29.3.2005, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 6
Всего: 55



Цитата(Alex @ 29.3.2005, 18:42)
Здесь тогда насколько я понимаю нужно только на null проверять.

Ну тогда необходимо проверять на null все поля!
Потому как например если в ту же country.db добавить запись у которой поле name = 'A' а поле Area = NULL то для очевидно не пустого запроса:
Код
SELECT Sum(Area), name FROM country.db Group By name

результат Query.Fields[0].IsNull будет True.

Это сообщение отредактировал(а) Петрович - 29.3.2005, 20:48


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
fess
Дата 29.3.2005, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



Спасибо Alex и Петрович за помощь!

to Alex, наверное, нужно дописать в FAQ DELPHI-DLP-002445 уточнение по поводу применения агрегатных функций в запросе.

--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Bes
Дата 5.4.2005, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



А так не пробовали?
Query.active:=true;
if query.recordcount=0 then ничего нет else есть.
По-моему всегда работает.
PM MAIL   Вверх
Петрович
Дата 5.4.2005, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 6
Всего: 55



Цитата(Bes @ 5.4.2005, 08:21)
По-моему всегда работает.

Работает то всегда. Но, проблема в том, что как писал выше Alex, если в запросе имеется агрегативная функция, то запрос всегда возвращает как минимум одну запись. Соответственно и RecordCount будет >= 1

Это сообщение отредактировал(а) Петрович - 5.4.2005, 08:30


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0860 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.