Russian Qt Forum

Qt => Базы данных => Тема начата: onlik от Ноябрь 30, 2009, 00:57



Название: Количество записей в QSqlQuery
Отправлено: onlik от Ноябрь 30, 2009, 00:57
Делаю
QSqlQuery query;
query.exec("SELECT * FROM table");
query.size() возвращает мне -1
помогите понять почему?
Запрос выполняется нормально, записи есть.
Помогите, мучаюсь не могу понять что не так :(


Название: Re: Количество записей в QSqlQuery
Отправлено: Vlad от Ноябрь 30, 2009, 01:35
Что за база? Не все типы баз поддерживают query.size. Oracle не поддерживает. Я вот так считал:

int size = 0 ;
while (query.next()) size++;


Название: Re: Количество записей в QSqlQuery
Отправлено: onlik от Ноябрь 30, 2009, 01:39
А...((((
Использую SQLITE, не поддерживается?

Я тоже так делаю, но это лишняя операция, у меня многой записей в базе и данные часто обновляются, время очень важное :(


Название: Re: Количество записей в QSqlQuery
Отправлено: break от Ноябрь 30, 2009, 13:34
раз БД не поддерживает - делай отдельный запрос

select count(*)
from SOME_TABLE


--- и получай количество записей за быстрое время


Название: Re: Количество записей в QSqlQuery
Отправлено: MoPDoBoPoT от Ноябрь 30, 2009, 16:55
раз БД не поддерживает - делай отдельный запрос
+1
Только не забываем про транзакции.


Название: Re: Количество записей в QSqlQuery
Отправлено: Alchazar от Декабрь 09, 2009, 11:29
Как передать значение COUNT() переменной? Что-то у меня qSize постоянно равен 0, хотя выполнив тот же запрос в базе получаю нормальное количество.

Код
C++ (Qt)
queryCount.exec("SELECT COUNT(hd_pcid) FROM hardware_data WHERE hd_pcid = '"+pc_id+"'");
       recordCount = queryCount.record();
       int qSize = queryCount.value(recordCount.indexOf("hd_pcid")).toInt();
пробовал так -
Код
C++ (Qt)
int qSize = queryCount.value(0).toInt;
но всё равно qSize = 0


Название: Re: Количество записей в QSqlQuery
Отправлено: Пантер от Декабрь 09, 2009, 12:36
Код
C++ (Qt)
queryCount->next()
Забыл. :)


Название: Re: Количество записей в QSqlQuery
Отправлено: Alchazar от Декабрь 09, 2009, 13:06
Спасибо,
Уже второй раз на next'е попадаюсь, надеюсь теперь запомню)


Название: Re: Количество записей в QSqlQuery
Отправлено: Alchazar от Декабрь 09, 2009, 13:45
Всё равно получаю 0,
перепробовал next, last, first, все возвращают 0
Код
C++ (Qt)
QSqlQuery queryCount;
QSqlRecord recordCount;
queryCount.exec("SELECT COUNT(hd_pcid) FROM hardware_data WHERE hd_pcid = '"+pc_id+"'");
queryCount.next();
recordCount = queryCount.record();
int qSize = queryCount.value(recordCount.indexOf("hd_pcid")).toInt(); //queryCount.value(0).toInt();
 
       QString strCount;
       strCount.setNum(qSize);
       lineEdit->setText(strCount);

Код:
sqlite> select count(hd_pcid) from hardware_data where hd_pcid = '2';
3
sqlite>




Название: Re: Количество записей в QSqlQuery
Отправлено: MoPDoBoPoT от Декабрь 09, 2009, 15:04
Во-первых, переменная pc_id, которая вставляется в запрос, имеет тип QString?

queryCount.value(recordCount.indexOf("hd_pcid")).toInt();
Во-вторых, в результирующей таблице поля с именем hd_pcid нет. Либо используй queryCount.value(0), либо писать в тексте запроса так: "SELECT COUNT(hd_pcid) AS 'cnt' FROM ...", а обращаться к полю так: recordCount.indexOf("cnt")


Название: Re: Количество записей в QSqlQuery
Отправлено: Alchazar от Декабрь 09, 2009, 15:11
QString pc_id = FMain::trWd_tree->currentItem()->text(3);

Цитировать
Во-вторых, в результирующей таблице поля с именем hd_pcid нет.

Код
C++ (Qt)
queryCount.exec("SELECT COUNT(hd_pcid) AS pc_count FROM...
int qSize = queryCount.value(recordCount.indexOf("
pc_count")).toInt();
Это я уже понял и исправил, но результат всё равен 0


Название: Re: Количество записей в QSqlQuery
Отправлено: MoPDoBoPoT от Декабрь 09, 2009, 15:46
Не знаю, это опечатка или опять позабыт queryCount.next(); :)
Вообще можно еще проверки делать. Методы exec(), next() возвращают признак успеха, также есть метод lastError().


Название: Re: Количество записей в QSqlQuery
Отправлено: Alchazar от Декабрь 09, 2009, 15:58
На данный момент код выглядит так:
       
Код
C++ (Qt)
       QString pc_id = FMain::trWd_tree->currentItem()->text(3);
 
       QSqlQuery query, queryCount;
       QSqlRecord record, recordCount;
       queryCount.exec("SELECT COUNT(hd_pcid) AS pc_count FROM hardware_data WHERE hd_pcid = '"+pc_id+"'");
       queryCount.next();
       recordCount = queryCount.record();
       int qSize = queryCount.value(recordCount.indexOf("pc_count")).toInt(); //queryCount.value(0).toInt();//=
 
       QString new_id;
       new_id.setNum(qSize);
       lineEdit->setText(new_id);
       lineEdit_2->setText(queryCount.lastError().text());

Next я не забыл), просто не скопировал строчку)
lastError() ошибок не показывает.
lastQuery() показывает правильный запрос, скопировав его в sqlite получаю ответ.
 Уже не знаю что тут можно ещё найти, к чему прицепиться.


Название: Re: Количество записей в QSqlQuery
Отправлено: Пантер от Декабрь 09, 2009, 17:42
Попробуй так:
 
Код
C++ (Qt)
      QString pc_id = FMain::trWd_tree->currentItem()->text(3);
 
       QSqlQuery query, queryCount;
       queryCount.prepare("SELECT COUNT(hd_pcid) AS pc_count FROM hardware_data WHERE hd_pcid =:hd_pcid");
       queryCount->bindValue(":hd_pcid", pc_id);
       queryCount->exec();
       queryCount.next();
       int qSize = queryCount.value(0).toInt();
 
       QString new_id;
       new_id.setNum(qSize);
       lineEdit->setText(new_id);
       lineEdit_2->setText(queryCount.lastError().text());


Название: Re: Количество записей в QSqlQuery
Отправлено: Alchazar от Декабрь 09, 2009, 17:50
Попробовал, всё равно 0.
Может можно ещё какие проверки зделать?

я добавил
Код:
if (queryCount.exec()) 
и 
Код:
if (recordCount.isEmpty())
всё проходит, может ещё как-то можно поискать места в которых могут буть ошибки?


Название: Re: Количество записей в QSqlQuery
Отправлено: Alchazar от Декабрь 10, 2009, 11:35
Я так понимаю, только с помощью
Код:
while (queryCount.next()) {..}
получится пощитать количество записей?


Название: Re: Количество записей в QSqlQuery
Отправлено: Пантер от Декабрь 10, 2009, 12:31
1. Попробуй count(*)
2. Сделай минимальный прмер + БД с этой таблицей и сюда скинь.


Название: Re: Количество записей в QSqlQuery
Отправлено: Alchazar от Декабрь 10, 2009, 13:42
я уже выяснил в чём была моя проблема.... в невнимательности, я ввёл данные не в ту базу, с которой работал. Пару дней назад делал копию и всё скопировал в папку с похожим названием, а когда подключался к базе с помощью sqlite3.exe, я ошибся папкой(
И морочил всем тут головы весь день  :-[

п.с.
Код
C++ (Qt)
queryCount.exec("SELECT COUNT(hd_pcid) AS pc_count FROM hardware_data WHERE hd_pcid = '"+pc_id+"'");
queryCount.next();
recordCount = queryCount.record();
int qSize = queryCount.value(recordCount.indexOf("pc_count")).toInt();
работает без проблем



Название: Re: Количество записей в QSqlQuery
Отправлено: MoPDoBoPoT от Декабрь 10, 2009, 16:10
 :)
Да, такие слабоуловимые вещи частенько бывают. Нервы портят будь здоров.

P.S. В общем случае, запросы с COUNT(field) и COUNT(*) неравнозначны. COUNT(field) даст количество строк, у которых поле field не равно NULL.
В твоем примере это никак не отразится, но и смысла нет писать COUNT(hd_pcid).


Название: Re: Количество записей в QSqlQuery
Отправлено: vexar от Январь 21, 2010, 04:19
Подскажите, а как теперь результат вставить в QLabel ?
Пробывал так:

Код:
QLabel *Gef = new QLabel("Найдено:", this,  qSize);


Название: Re: Количество записей в QSqlQuery
Отправлено: BaltikS от Январь 21, 2010, 06:46
Подскажите, а как теперь результат вставить в QLabel ?
Пробывал так:

Код:
QLabel *Gef = new QLabel("Найдено:", this,  qSize);
Код:
QLabel *Gef = new QLabel(tr("Найдено: ")+QString::number(qSize), this);


Название: Re: Количество записей в QSqlQuery
Отправлено: xokc от Январь 21, 2010, 21:22
Код:
QLabel *Gef = new QLabel(tr("Найдено: %1").arg(qSize), this);