crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Почитать количество ROW в QSqlQuery, Почитать количество ROW в QSqlQuery
fortero
  опции профиля:
сообщение 26.4.2011, 19:46
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 4.12.2010
Пользователь №: 2242

Спасибо сказали: 0 раз(а)




Репутация:   0  


И с нова я...
Подскажите пожалуйста как оптимально экономично используя ресурсы, и логически правельно узнать количество строк в запросе?
У меня есть такой вариант, но что то мне подсказует что он не целисообразно использует ресурсы!

if(!db.open()){
            return 1;
        }else{
            //
            QSqlQuery query;
            
            query.exec("SELECT id,name,description FROM firm;");
            QSqlRecord rec = query.record();
            
            query.last();
            
            int rrr = query.size();
            query.first();            
            while(query.next()){
                qDebug() << query.value(rec.indexOf("id")).toInt() << query.value(rec.indexOf("name")).toString();
            }
            
            qDebug() << "Rows: " << rrr;
        return 0;
        }

Буду очень признателен если кто-то прольёт свет, спасибо за внимание!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 26.4.2011, 19:52
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


int QSqlQuery::size () const
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 26.4.2011, 20:13
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 4.12.2010
Пользователь №: 2242

Спасибо сказали: 0 раз(а)




Репутация:   0  


А это не оно?
int rrr = query.size();


Дело в том, что для того что бы вызвать выше указанную функцию итератору как я понимаю надо пролестать весь контейнер QSqlQuery, а это затраты на итерацию более проще можно получить сведенья?

Сообщение отредактировал fortero - 26.4.2011, 20:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 26.4.2011, 20:41
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


не понимаю тебя, ты написал в теме посчитать количество строк, query.size() даёт результат, при чём здесь обход элементов?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 26.4.2011, 21:13
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 4.12.2010
Пользователь №: 2242

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(abc @ 26.4.2011, 20:41) *
не понимаю тебя, ты написал в теме посчитать количество строк, query.size() даёт результат, при чём здесь обход элементов?

Я в посте написал не как вообще решить эту проблему а как максимально правельно с точки зрения нагрузки, что бы максимально разумно использовать ресурсы!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 26.4.2011, 21:34
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


А почему ты сомневаешься, что это оптимально?

Сообщение отредактировал abc - 26.4.2011, 21:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 26.4.2011, 22:07
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(abc @ 26.4.2011, 22:34) *
я думаю, при выборке из БД в какой-нибудь приватный член QSqlQuery пишется количество выбранных строк, после чего при запросе query.size() ты значение этого члена и извлекаешь, т.е. query.size() не считает строки

Это верно, если драйвер (и СУБД) поддерживает данную фичу.
Цитата(fortero @ 26.4.2011, 20:46) *
Подскажите пожалуйста как оптимально экономично используя ресурсы, и логически правельно узнать количество строк в запросе?

Обычно пишется SQL-запрос вида:
SELECT COUNT(*) FROM my_table

Если возвращаемое число каким-то образом используется для изменении данных в БД, то запрос на количество записей и изменение данных делается в рамках одной транзакции, чтобы данные были консистентными.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 26.4.2011, 22:15
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 4.12.2010
Пользователь №: 2242

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(MoPDoBoPoT @ 26.4.2011, 22:07) *
Цитата(abc @ 26.4.2011, 22:34) *
я думаю, при выборке из БД в какой-нибудь приватный член QSqlQuery пишется количество выбранных строк, после чего при запросе query.size() ты значение этого члена и извлекаешь, т.е. query.size() не считает строки

Это верно, если драйвер (и СУБД) поддерживает данную фичу.
Цитата(fortero @ 26.4.2011, 20:46) *
Подскажите пожалуйста как оптимально экономично используя ресурсы, и логически правельно узнать количество строк в запросе?

Обычно пишется SQL-запрос вида:
SELECT COUNT(*) FROM my_table

Если возвращаемое число каким-то образом используется для изменении данных в БД, то запрос на количество записей и изменение данных делается в рамках одной транзакции, чтобы данные были консистентными.


Про это я знаю:
SELECT COUNT(*) FROM my_table

Но как извлечь данные из такого запроса не смейтесь я только начинаю в Qt работать и мне пока многое не понятно...
И как сделать 2 запроса в рамках одной транзакции? Просто мне внчале надо получить данные о количестве строк для передачи в мою функцию, а лиш потом получать контейнер query...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 27.4.2011, 4:47
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Если БД не SQLite то query.numRowsAffected();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 27.4.2011, 8:24
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Цитата(fortero @ 26.4.2011, 23:15) *
Просто мне внчале надо получить данные о количестве строк для передачи в мою функцию, а лиш потом получать контейнер query...


С точки зрения оптимальности я бы выполнил запрос данных, затем эти данные поместил в контейнер (например в QList) попутно обрабатывая данные. В итоге имеем
1. через QList::count() я могу получить кол-во записей, причем независимо от возможностей sql драйвера
2. данные уже преобразованы и готовы к дальнейшей обработке.

Все лучше чем делать два sql запроса)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.11.2019, 0:55