Russian Qt Forum

Qt => Базы данных => Тема начата: z11t3 от Октябрь 11, 2010, 11:48



Название: MySQL ошибка при выполнении запроса, возвращающего NULL
Отправлено: z11t3 от Октябрь 11, 2010, 11:48
Два запроса:
Цитировать
sqlQuery.prepare("SELECT * FROM ti ORDER BY tiid DESC LIMIT 1");
            sqlQuery.exec();
            sqlQuery.next();
            Archiver.countTI = sqlQuery.value(0).toInt();//полученное количество записей в текущей рабочей таблице

            sqlQuery.prepare("SELECT * FROM messages ORDER BY msgid DESC LIMIT 1");
            sqlQuery.exec();//ВЫЛЕТАЕТ ТУТ
            sqlQuery.next();
            Archiver.countMS = sqlQuery.value(0).toInt();//так-же для сообщений
Вылетает следующий эксцепшн:
(http://img189.imageshack.us/img189/8664/47208465.th.jpg) (http://img189.imageshack.us/i/47208465.jpg/)


Таблица ti содержит примерно 700к записей.
Таблица messages содержит примерно 0 записей.
Как обойти сей момент кодом?

Пробовал:
Цитировать
if (sqlQuery.exec())
            {
               sqlQuery.next();
               Archiver.countMS = sqlQuery.value(0).toInt();//так-же для сообщений
            }
            else
               Archiver.countMS = 0;
Что-то никак не найду в документации нужной инфы, ну не создавать же в конце концов запись в таблице =(
Есть идея запросить размер так:
Цитировать
sqlQuery.prepare("SELECT COUNT(*) FROM tc");
Но она несколько не устраивает
1) запрос этот дольше вышеприведенного
2) не гаратируется точность (проверено для таблиц >>1M записей)


Название: Re: MySQL ошибка при выполнении запроса, возвращающего NULL
Отправлено: shirushizo от Октябрь 11, 2010, 17:47
Код:
f (sqlQuery.exec())
            {
               sqlQuery.next();
               Archiver.countMS = sqlQuery.value(0).toInt();//так-же для сообщений
            }
            else
               Archiver.countMS = 0;

bool QSqlQuery::exec() возвращает true, если запрос выполнен успешно, даже при нулевом количестве возвращаемых записей, а bool QSqlQuery::next() возвращает true, если курсор не вышел за датасэт. Так должно сработать:
Код:
if (sqlQuery.next())
               Archiver.countMS = sqlQuery.value(0).toInt();//так-же для сообщений
            else
               Archiver.countMS = 0;