Версия Delphi - 7.

Я отправляю запрос в базу данных MySQL. Может быть возвращен либо набор строк данных, либо просто пустой набор. Ничего необычного. Но я понятия не имею, как создать механизм проверки, который будет проверять, является ли это набором данных или пустым набором.

Вот код:

var
    Q: TADOQuery;
begin
    Q := TADOQuery.Create(self);
    Q.Connection := ADOConnection;

    Q.SQL.Add('CALL get_shopping_cart_list()'); // Call stored procedure
    Q.Open;                                     // Send query and get some
                                                // results back
    // PSEUDOCODE
    // IF get_shopping_cart_list() RETURNS A NON-EMPY SET THEN
    //     SHOW WHAT WE HAVE
    // ELSE
    //     SHOW A MESSAGE THAT SAYS 'EMPTY SET'

    Q.Free;
end;
1
Mikhail 9 Апр 2013 в 20:20

1 ответ

Лучший ответ

В зависимости от версии Delphi это может быть либо

 if Q.IsEmpty then ...

Или

 if Q.BOF and Q.EOF then ...

Вы также можете погрузиться в Microsoft ADO. Если в вашем запросе нет нескольких операторов, подойдут Q.RecordSet.EOF и Q.RecordSet.BOF.


Также не забывайте защищать управление памятью от ошибок.

 Q := TADOQuery.Create;
 try
    .... do this or that ....
    .... do this or that ....
    .... do this or that ....
 finally
    Q.free;
 end;
5
kobik 9 Апр 2013 в 23:50
1
Нет. ADO утверждает, что может просто вернуть -1. Также это SP. Чтобы подсчитать все записи в однонаправленном курсоре, вы должны фактически извлечь их все, пройти через сеть, а затем кэшировать в ОЗУ клиента. Думаю, и у сервера, и у клиента есть дела поважнее. Использование RecordCount - обычная тема для людей, перешедших с DBF / CSV / Paradox на SQL, но обычно это плохой совет для любой библиотеки доступа к БД, включая OLE DB. msdn.microsoft.com/ru-RU/library/windows/ desktop / ms676701.aspx
 – 
Arioch 'The
9 Апр 2013 в 20:31
Похоже, условие Q.RecordCount> 0 подойдет. Что вы думаете?
 – 
Mikhail
9 Апр 2013 в 20:39
IsEmpty пока что кажется лучшим подходом.
 – 
Mikhail
9 Апр 2013 в 20:41
1
Как я уже сказал выше, RecordCount - очень плохая привычка в SQL. Но если вам нужно заменить один логический вызов функции медленным и ненадежным целочисленным вызовом функции и сравнениями, в которых вы можете ошибиться, например RecordCount >= 0 или RecordCount > i0, или любой другой случайной ошибкой, которую вы можете сделать ... Что ж, по крайней мере, это будет легко исправить позже, чтобы выпустить следующую версию :-D
 – 
Arioch 'The
9 Апр 2013 в 20:42