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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Рост журнала транзакций (tempdb) при выполнении запросов SELECT [РЕШЕНО]  (Прочитано 8497 раз)
Andrew12
Гость
« : Июль 28, 2011, 11:49 »

Здравствуй, многоуважаемый All

Использую QT+MSSQL+ODBC.
Соединение:
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={SQL...}");
QSqlDatabase::database().open();

Запрос на выборку:
Код:
QSqlQueryModel *qModel = new QSqlQueryModel();
qModel->setQuery("SELECT * FROM TABLE X");

Так вот если использую запрос на выборку n-раз происходит рост журнала транзакций (tempdb). Если заключить выборку в транзакцию:
Код:
QSqlDatabase::database ().transaction ();
qModel->setQuery(querystring);
QSqlDatabase::database ().commit();
рост прекращается, но и qModel перестает содержать данные и как следствие их невозможно дальше обработать.

Помогите кто чем может!
« Последнее редактирование: Июль 28, 2011, 13:32 от Andrew12 » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Июль 28, 2011, 11:56 »

Цитировать
Так вот если использую запрос на выборку n-раз происходит рост журнала транзакций (tempdb).
Не распарсил. Поставь знаки препинания.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Andrew12
Гость
« Ответ #2 : Июль 28, 2011, 12:04 »

Что имеется ввиду? Точку с запятой в конце запроса или Go?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #3 : Июль 28, 2011, 12:07 »

Ты делаешь выборку n-раз или журнал растет n-раз?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Andrew12
Гость
« Ответ #4 : Июль 28, 2011, 12:18 »

После, скажем, 10 выполнений

Код:
QSqlQueryModel *qModel = new QSqlQueryModel();
qModel->setQuery("SELECT * FROM TABLE X");

журнал прибавляет в весе 5 Мб
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #5 : Июль 28, 2011, 12:29 »

А кто удалять модели будет?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Andrew12
Гость
« Ответ #6 : Июль 28, 2011, 12:42 »

Вы знаете, помогло, методом qModel->~QSqlQueryModel. Спасибо.
Но вопрос! Как ее уничтожать, если эта модель потом tableview->setModel(qModel);
Путем tableview.~QTableView?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #7 : Июль 28, 2011, 12:52 »

Цитировать
qModel->~QSqlQueryModel
tableview.~QTableView?
Сурово))
Я где то уже видел надавно такой же шедевр)

Код
C++ (Qt)
QSqlQueryModel *qModel = new QSqlQueryModel(this);
 
и всё.
Есть же куча литературы по Qt..

Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #8 : Июль 28, 2011, 12:54 »

Модель нужно создавать один раз, а не на каждый запрос.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Andrew12
Гость
« Ответ #9 : Июль 28, 2011, 13:08 »

to m_ax: Я, вообщем, осознаю, что уничтожение можно производить путем уничтожения родителя.

Хорошо, припустим:
1. Есть клас, работающий с БД и, по вашему утверждению, имеющий один свой QSqlQueryModel.
2. Есть различные формы, отображающие данные в TableView по некому SQL-запросу.

Как разместить результаты различных запросов в этих tableview, если QSqlQueryModel един?
« Последнее редактирование: Июль 28, 2011, 13:10 от Andrew12 » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #10 : Июль 28, 2011, 13:09 »

Модель нужно создавать один раз, а не на каждый запрос.
Согласен)
Указатель на qModel лучше сделать членом класса и в конструкторе один раз её создать:
Код
C++ (Qt)
qModel = new QSqlQueryModel(this);
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #11 : Июль 28, 2011, 13:14 »

to m_ax: Я, вообщем, осознаю, что уничтожение можно производить путем уничтожения родителя.

Хорошо, припустим:
1. Есть клас, работающий с БД и, по вашему утверждению, имеющий один свой QSqlQueryModel.
2. Есть различные формы, отображающие данные в TableView по некому SQL-запросу.

Как разместить результаты различных запросов в этих tableview, если QSqlQueryModel един?
Да легко. Один раз создаешь модель и устанавливаешь ее на вьюху. Различные формы передают sql строку, которую и устанавливаешь через qModel->setQuery.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Andrew12
Гость
« Ответ #12 : Июль 28, 2011, 13:21 »

Приведу пример:
Код:
QSqlQueryModel * ADatabase::selectSql(QString querystring) {
    qModel->setQuery(querystring);
    if (qModel->lastError().isValid()) {
        qDebug() << qModel->lastError();
        qDebug() << "SQL code:" << querystring;
    }
    while (qModel->canFetchMore()) {
        qModel->fetchMore();
    }
    return qModel;
}

Функция не статична, работает с членом класа qModel и возвращает его в качестве результата. 1. Запрос передал, 2. модель получил 3. установил эту модель tableview->setModel().
Теперь из другой формы обращаюсь к этому же класу ADatabase с другим запросом. Результат - модель меняется - меняются данные первой tableview.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #13 : Июль 28, 2011, 13:23 »

Ничего не понял, но чувствую, что у тебя что-то не так с архитектурой приложения.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Andrew12
Гость
« Ответ #14 : Июль 28, 2011, 13:31 »

Ничего. Все равно спасибо. Будем разбираться ))
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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