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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Количество записей в QSqlQuery  (Прочитано 24144 раз)
onlik
Гость
« : Ноябрь 30, 2009, 00:57 »

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

Что за база? Не все типы баз поддерживают query.size. Oracle не поддерживает. Я вот так считал:

int size = 0 ;
while (query.next()) size++;
Записан
onlik
Гость
« Ответ #2 : Ноябрь 30, 2009, 01:39 »

А...((((
Использую SQLITE, не поддерживается?

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

Сообщений: 846


Просмотр профиля
« Ответ #3 : Ноябрь 30, 2009, 13:34 »

раз БД не поддерживает - делай отдельный запрос

select count(*)
from SOME_TABLE


--- и получай количество записей за быстрое время
Записан
MoPDoBoPoT
Гость
« Ответ #4 : Ноябрь 30, 2009, 16:55 »

раз БД не поддерживает - делай отдельный запрос
+1
Только не забываем про транзакции.
Записан
Alchazar
Гость
« Ответ #5 : Декабрь 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
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Декабрь 09, 2009, 12:36 »

Код
C++ (Qt)
queryCount->next()
Забыл. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alchazar
Гость
« Ответ #7 : Декабрь 09, 2009, 13:06 »

Спасибо,
Уже второй раз на next'е попадаюсь, надеюсь теперь запомню)
Записан
Alchazar
Гость
« Ответ #8 : Декабрь 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>


Записан
MoPDoBoPoT
Гость
« Ответ #9 : Декабрь 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")
Записан
Alchazar
Гость
« Ответ #10 : Декабрь 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
« Последнее редактирование: Декабрь 09, 2009, 15:28 от Alchazar » Записан
MoPDoBoPoT
Гость
« Ответ #11 : Декабрь 09, 2009, 15:46 »

Не знаю, это опечатка или опять позабыт queryCount.next(); Улыбающийся
Вообще можно еще проверки делать. Методы exec(), next() возвращают признак успеха, также есть метод lastError().
Записан
Alchazar
Гость
« Ответ #12 : Декабрь 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 получаю ответ.
 Уже не знаю что тут можно ещё найти, к чему прицепиться.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Декабрь 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());
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alchazar
Гость
« Ответ #14 : Декабрь 09, 2009, 17:50 »

Попробовал, всё равно 0.
Может можно ещё какие проверки зделать?

я добавил
Код:
if (queryCount.exec()) 
и 
Код:
if (recordCount.isEmpty())
всё проходит, может ещё как-то можно поискать места в которых могут буть ошибки?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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