Название: query.lastError().isValid() не работает Отправлено: GraninDm от Август 29, 2012, 14:55 Добрый день!
Решил я проверить что будет с программой, если во время ее работы погасить postgresql, с которым она работает. Код банальный Код: query.exec("select ..."); Запустил программу, погасил сервер, и получил queryError = false Удивился, и переделал код Код: queryError = !query.exec("select ..."); exec() установил queryError в true, а query.lastError().isValid() вернула false; Хотя при подключенном сервере query.lastError().isValid() работало. Я что-то упустил? Название: Re: query.lastError().isValid() не работает Отправлено: GraninDm от Сентябрь 03, 2012, 14:54 Решил еще проверить...
qqqwwa = db->isValid(); qqqwwa = db->isOpen(); Вываливается Seg fault то на первой строке, то на второй. Объясните мне, что я не так делаю? Qt 4.7.4 32bit WinXP Название: Re: query.lastError().isValid() не работает Отправлено: andrew.k от Сентябрь 03, 2012, 15:24 Решил еще проверить... Решил проверить то же самое.qqqwwa = db->isValid(); qqqwwa = db->isOpen(); Вываливается Seg fault то на первой строке, то на второй. Объясните мне, что я не так делаю? То на первой, то на второй строке Seg fault не вываливается. Объясните мне, что я не так делаю? Название: Re: query.lastError().isValid() не работает Отправлено: GraninDm от Сентябрь 03, 2012, 15:56 Ок.
Нашел http://www.sql.ru/forum/actualthread.aspx?tid=426962 (http://www.sql.ru/forum/actualthread.aspx?tid=426962) вот это Вот этот момент мне в QT очень не нравится, но увы. При объявлении объекта типа QSqlDatabase в любом месте кроме стека появлется большое количество очень странных глюков. Объясните, почему нельзя ее создавать в куче? Название: Re: query.lastError().isValid() не работает Отправлено: andrew.k от Сентябрь 03, 2012, 15:58 Объясните, почему нельзя ее создавать в куче? А зачем её создавать в куче?Название: Re: query.lastError().isValid() не работает Отправлено: GraninDm от Сентябрь 03, 2012, 16:03 Т.е. вот так в классе нельзя делать?
private: QSqlDatabase *db; Название: Re: query.lastError().isValid() не работает Отправлено: andrew.k от Сентябрь 03, 2012, 17:30 Т.е. вот так в классе нельзя делать? еще раз, зачем так делать?private: QSqlDatabase *db; Ты в любой момент можешь получить нужный экземпляр класса QSqlDataBase Название: Re: query.lastError().isValid() не работает Отправлено: andrew.k от Сентябрь 03, 2012, 17:35 Нигде в QtSql не используется динамический экземпляр, зачем тебе это нужно?
Название: Re: query.lastError().isValid() не работает Отправлено: GraninDm от Сентябрь 03, 2012, 21:21 Спасибо, натолкнули на правильный путь.
Понял, что с самого начала неправильно сделал. Буду переделывать. Название: Re: query.lastError().isValid() не работает Отправлено: GraninDm от Сентябрь 04, 2012, 09:40 А по первому сообщению, может кто подскажет, как в моем случае получить код и текст ошибки?
сервер postgres погашен, но подключение к базе было установлено ранее Код: QSqlDatabase db = QSqlDatabase::database(); Посмотрел в исходниках qsqlquery и qsql_psql Код: Note that the last error for this query is reset when exec() is В противном случае ошибка сбрасывается Так получается? Название: Re: query.lastError().isValid() не работает Отправлено: GraninDm от Сентябрь 04, 2012, 12:40 Короче, подправил драйвер psql
Код: bool QPSQLResultPrivate::processResults() Мой код Код: queryError = !query.exec(); Так работает Код: Подключение установлено, сервер работает Может я не прав? Добавил Оказывается для mysql зарегистрирован bug https://bugreports.qt-project.org/browse/QTBUG-4926 (https://bugreports.qt-project.org/browse/QTBUG-4926) Для psql похоже то же самое. Название: Re: query.lastError().isValid() не работает Отправлено: fte от Сентябрь 04, 2012, 14:05 А что будет?
query("select 1 where 0!=0") qDebug() << query.lastError().text(); Название: Re: query.lastError().isValid() не работает Отправлено: GraninDm от Сентябрь 04, 2012, 14:19 А что будет? query("select 1 where 0!=0") qDebug() << query.lastError().text(); Код: QSqlQuery queryTemp("select 1 where 0!=0"); Драйвер с моими исправлениями При работающем сервере false " " При неработающем true "server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. А вот так с родным соответственно false " " false " " Название: Re: query.lastError().isValid() не работает Отправлено: andrew.k от Сентябрь 04, 2012, 14:25 Выложил бы, что исправил в драйвере.
Вдруг кому пригодится. Название: Re: query.lastError().isValid() не работает Отправлено: GraninDm от Сентябрь 04, 2012, 14:35 Так я же выложил
Было Код: bool QPSQLResultPrivate::processResults() Стало Код: bool QPSQLResultPrivate::processResults() Название: Re: query.lastError().isValid() не работает Отправлено: andrew.k от Сентябрь 04, 2012, 14:43 Так я же выложил извини, забыл просто. |