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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlQuery::value: not positioned on a valid record  (Прочитано 16193 раз)
Alchazar
Гость
« : Ноябрь 20, 2009, 17:10 »

Хочу узнать group_id имея group_name, вроде всё элементарно, надо всего лишь сделать так:
Код:
       QString gr_id;
        //find group Id
        query_gr.exec("SELECT group_id, group_name FROM groups WHERE group_name = " + group);
        QSqlRecord record_gr = query_gr.record();
        gr_id = query_gr.value(record_gr.indexOf("group_id")).toString();//.toInt();
        lineEdit->setText(gr_id);

но получаю пустой результат(
а в Application output пишет:
QSqlQuery::value: not positioned on a valid record

Базу использую SQLite, может проблема в том, что я уже обращался к базе? Может надо закрывать базу(отключаться от базы) перед сл. запросом?

Код:
createConnection();

        //find last pc ID
        QSqlQuery query, query_gr;
        query.exec("SELECT pc_id, pc_name FROM pc WHERE pc_id = (SELECT MAX(pc_id) FROM pc)");
        QSqlRecord record = query.record();
        if (!query.isNull(0))
        {
            query.last();
            old_id = query.value(record.indexOf("pc_id")).toInt();
            old_id++;
        }
        else
        old_id = 1;

        QString gr_id;
        //find group Id
        query_gr.exec("SELECT group_id, group_name FROM groups WHERE group_name = " + group);

        QSqlRecord record_gr = query_gr.record();

        gr_id = query_gr.value(record_gr.indexOf("group_id")).toString();//.toInt();

        lineEdit->setText(gr_id);

        //Add new pc to DB
        query.prepare("INSERT INTO pc VALUES (:new_id ,:new_group, :new_name, :new_ip, :new_comment)");
        query.bindValue(":new_id", old_id);
        query.bindValue(":new_group", gr_id);
        query.bindValue(":new_name", pc_name);
        query.bindValue(":new_ip", pc_ip);
        query.bindValue(":new_comment", pc_comment);
       // query.exec();

Записан
MoPDoBoPoT
Гость
« Ответ #1 : Ноябрь 20, 2009, 17:19 »

Из документации к методу QSqlQuery::exec():
Цитата: QtAssistant
After the query is executed, the query is positioned on an invalid record and must be navigated to a valid record before data values can be retrieved (for example, using next()).
Надо просто спозиционировать указатель на данные. Примерно так:
Код
C++ (Qt)
...
query_gr.exec("SELECT group_id, group_name FROM groups WHERE group_name = " + group);
if (query_gr.next()) {
       QSqlRecord record_gr = query_gr.record();
       gr_id = query_gr.value(record_gr.indexOf("group_id")).toString();//.toInt();
       ...
}
...
 
Записан
Alchazar
Гость
« Ответ #2 : Ноябрь 20, 2009, 17:27 »

Такой вариант даёт новую ошибку в Application output:
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

Не совсем понимаю при чём тут duplicate connection и что за old connection, откуда он берётся?

функция с которой я подключаюсь к ДБ:
Код:
static bool createConnection()
{
    // connect to database
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("htmon_db.db");
    if (!db.open())
    {
        QMessageBox::critical(0, qApp->tr("Unable to establish a database connection"),
                qApp->tr("Unable to establish a database connection.\n\n"
                         "Click Cancel to exit."), QMessageBox::Cancel,
                         QMessageBox::NoButton);
        return false;
    }
    return true;
}



Выяснил где была ошибка, у меня createConnection() вызывался два раза, поэтому и получал ошибку.
« Последнее редактирование: Ноябрь 20, 2009, 17:47 от Alchazar » Записан
Alchazar
Гость
« Ответ #3 : Ноябрь 20, 2009, 17:50 »

Но
Код:
 
if (query_gr.next()) {
        QSqlRecord record_gr = query_gr.record();
        gr_id = query_gr.value(record_gr.indexOf("group_id")).toString();//.toInt();
        ...
}
не выполняется
Записан
MoPDoBoPoT
Гость
« Ответ #4 : Ноябрь 20, 2009, 18:17 »

А ошибки в запросе нет? Что возвращает exec()? (текст ошибки можно посмотреть в query_gr.lastError().text())
Скорей ошибка синтаксиса, т.к. по-моему для QSQLite в конце запроса надо ставить ;
Если ошибки нет, значит запрос возвращает 0 строк. Что содержит переменная group?
Записан
Alchazar
Гость
« Ответ #5 : Ноябрь 23, 2009, 10:43 »

Попробовал добавить ; в конце запроса, но ничего не помогло.
Посмотрел текст ошибки, как вы посоветовали, и выяснил в чём была проблема:
no such column: ofisas Unable to execute statement
немного исправил запрос и всё заработало
"SELECT group_id, group_name FROM groups WHERE group_name = ' " + group+ " ' ");

Спасибо за помощь.)

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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