Russian Qt Forum
Ноябрь 24, 2024, 01:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlQuery не выполняется. Ошибок не вызывает.  (Прочитано 3733 раз)
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 - тут все хорошо.

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

Что не так?

С уважением, Олег.
« Последнее редактирование: Декабрь 16, 2011, 11:32 от lrx2 » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #1 : Декабрь 16, 2011, 11:40 »

Я правильно понимаю, что вы хотите в QTableView вывести результат запроса ?

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

1. QTableView работает вроде  как с QSqlQueryModel ,а запрос выполняется в QSqlQuery. После выполнения запроса QSqlQuery как то передается в QSqlQueryModel ?
2. Смотрим код последний с запросом, и там написано, что если все выполнилось хорошо то делаем sql.clear();  Улыбающийся
Записан
lrx2
Гость
« Ответ #2 : Декабрь 16, 2011, 14:32 »

неее... суть в том, что мне именно надо получить данные из бд, но никак не прикрепляя это ник модели, ни к view.
Тупо хочу сделать диалог по добавлению (потом о модификации и удалению), но для этого надо получить список значений внешних ключей таблицы..
Про clear - спасибо, учту. Странно, что ни в одной статье этого не было.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Декабрь 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(). только не забудь проверить возвращает ли он что нибудь  Подмигивающий
Записан
lrx2
Гость
« Ответ #4 : Декабрь 16, 2011, 17:41 »

numRowsAffected чет 0 возвращает, даже после next() - был сбит с толку.
Зато size работает.
Про clear - протупил, сорри) Думал, я его не использовал))
Там, просто, пока обработки нет, потому как конечный этап думал очистить, но
там он и впрямь нафиг не нужен.. ночной код, чтоб его.

Спасибо. Задача решена,)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 23.