Russian Qt Forum

Qt => Базы данных => Тема начата: lrx2 от Декабрь 16, 2011, 11:19



Название: QSqlQuery не выполняется. Ошибок не вызывает.
Отправлено: lrx2 от Декабрь 16, 2011, 11:19
Доброго времени суток.
Работаю с БД PSQL через QTableView + QSqlQueryModel.
На view данные выводятся при запросах
Код:
model->setTable('table');
model->select();

Соединение с БД производится сл. образом:
Код:
db = QSqlDatabase::addDatabase("QPSQL");
    if(!db.isValid()){
        QString qs;
        qs.append(tr("DLL драйверов для PostgreSQL не найдены:\n\n'%1;'").arg(db.lastError().text()));
        qs.append(tr("\n\nDll должны располагаться по одному из путей : \n\n%1\n\n\n%2").arg(QApplication::libraryPaths()[0],QApplication::libraryPaths()[1]));
        FATAL(qs);
        return;
    }

    db.setHostName("localhost");
    db.setDatabaseName("SHOP");
    db.setUserName("postgres");
    db.setPassword("7777777");
    db.setPort(5432);

    if (!db.open()){
        FATAL(tr("Невозможно подключиться к указанной БД:\n\n%1::%2").arg(db.hostName(), db.databaseName()));
        return;
    }

В слоте  для нажатия на кнопку стоит сл. код:
Код:
QSqlQuery sql(db);
    sql.exe(tr("select * from categories"));
    if(!sql.isActive())FATAL(tr("Not active"));   
        QString qs;               
        qs.append(tr("'%1'\n\n\nQuo=%2; \n'%3'")
                    .arg(sql.record().value(1).toString())
                    .arg(sql.numRowsAffected())
                    .arg(sql.lastError().driverText()));

        if(sql.lastError().type() == QSqlError::NoError){
            qs.append(tr("no error"));
        }
        FATAL(qs);

        sql.clear();
Ежель запрос не корректный - пишет, что не isActive - тут все хорошо.

Никаких ошибок не выводится, если запрос корректный, но при этом и данных никаких не получается.
*ЗЫ: запрос создаётся и выполняется уже после соединения с базой, ессно.

Что не так?

С уважением, Олег.


Название: Re: QSqlQuery не выполняется. Ошибок не вызывает.
Отправлено: ecspertiza от Декабрь 16, 2011, 11:40
Я правильно понимаю, что вы хотите в QTableView вывести результат запроса ?

Тогда возникают два вопроса:

1. QTableView работает вроде  как с QSqlQueryModel ,а запрос выполняется в QSqlQuery. После выполнения запроса QSqlQuery как то передается в QSqlQueryModel ?
2. Смотрим код последний с запросом, и там написано, что если все выполнилось хорошо то делаем sql.clear();  :)


Название: Re: QSqlQuery не выполняется. Ошибок не вызывает.
Отправлено: lrx2 от Декабрь 16, 2011, 14:32
неее... суть в том, что мне именно надо получить данные из бд, но никак не прикрепляя это ник модели, ни к view.
Тупо хочу сделать диалог по добавлению (потом о модификации и удалению), но для этого надо получить список значений внешних ключей таблицы..
Про clear - спасибо, учту. Странно, что ни в одной статье этого не было.


Название: Re: QSqlQuery не выполняется. Ошибок не вызывает.
Отправлено: ecspertiza от Декабрь 16, 2011, 17:04
перед

Код:
qs.append(tr("'%1'\n\n\nQuo=%2; \n'%3'")
                    .arg(sql.record().value(1).toString())
                    .arg(sql.numRowsAffected())
                    .arg(sql.lastError().driverText()));

нужно поставить sql.next() в таком случае.

А про clear() я имел ввиду то, что с запросом ничего не делается ,но мы его очищаем.
История такая что exec() просто выполнит запрос, но для того что бы получить данные из QSqlQuery необходимо пробежаться по ним, если запись одна вполне подойдет next(). только не забудь проверить возвращает ли он что нибудь  ;)


Название: Re: QSqlQuery не выполняется. Ошибок не вызывает.
Отправлено: lrx2 от Декабрь 16, 2011, 17:41
numRowsAffected чет 0 возвращает, даже после next() - был сбит с толку.
Зато size работает.
Про clear - протупил, сорри) Думал, я его не использовал))
Там, просто, пока обработки нет, потому как конечный этап думал очистить, но
там он и впрямь нафиг не нужен.. ночной код, чтоб его.

Спасибо. Задача решена,)