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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сброс данных из QSqlQueryModel при вызове хранимой процедуры  (Прочитано 6398 раз)
ROKR
Гость
« : Апрель 07, 2010, 15:46 »

В одном окне имеется QSqlQueryModel, которая выполняет запрос данных из представления. Данные выводятся в QTabelView. В другом окне через QSqlQuery происходит вызов хранимой процедуры ("EXEC ..."), после чего все данные в QSqlQueryModel из первого окна теряются.  Это можно как-то исправить?
Записан
crossly
Гость
« Ответ #1 : Апрель 07, 2010, 15:54 »

исправить можно.... код покажи....
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Апрель 07, 2010, 15:57 »

как я понимаю, всё сидит на одном соединении с БД.
Записан

Юра.
ROKR
Гость
« Ответ #3 : Апрель 07, 2010, 15:58 »

Вызов QSqlQueryModel:

Код:
DatabaseView = new QTableView();
DatabaseView->setEditTriggers( QAbstractItemView::NoEditTriggers );

OperatorModel = new QSqlQueryModel();
OperatorModel->setQuery(QueryTableString,*db);

DatabaseView->setModel(OperatorModel);

Вызов QSqlQuery:

Код:
if(!query->exec("EXEC MinTimeWithDriver N'" + RouteName + "', "+ Id))
{
    QMessageBox::critical(this, codec->toUnicode("Ошибка!"),
                          codec->toUnicode("Ошибка запроса: \n") + query->lastError().text(),QMessageBox::Ok,NULL);
}

if(query->next())...
Записан
ROKR
Гость
« Ответ #4 : Апрель 07, 2010, 15:59 »

как я понимаю, всё сидит на одном соединении с БД.

Да. Стоить сделать второе подключение?
Записан
crossly
Гость
« Ответ #5 : Апрель 07, 2010, 16:17 »

а что есть *db... и как query объявлен??
Записан
ROKR
Гость
« Ответ #6 : Апрель 07, 2010, 16:36 »

а что есть *db... и как query объявлен??

В конструкторе класса:

Код:
QSqlDatabase *db;

Объявление query:

Код:
QSqlQuery *query = new QSqlQuery(*db);

Указатель на db передаю из окна подключения в другие классы. Хотя, видимо это не нужно...

Забыл, что в еще одном классе тоже вызываю хранимую процедуру, но такой ошибки не происходит.
Провел еще пару опытов и заметил, что:
1) После потери данных такое ощущение, что теряется коннект к базе, потому что другие окна с обычными QSqlRelationTabelModel не могут открыть таблицы.
2) Если эта хранимая процедура возвращает NULL, то данные не теряются.
Записан
ROKR
Гость
« Ответ #7 : Апрель 07, 2010, 17:24 »

В других местах программы вызов этой хранимой процедуры также сопровождается потерей данных.
Записан
ROKR
Гость
« Ответ #8 : Апрель 07, 2010, 17:45 »

В output вывалилась ошибка "Подключение занято до получения результатов для другого HSTMT". Подправил хранимию процедуру, и все заработало  Строит глазки Всем спасибо!
Записан
crossly
Гость
« Ответ #9 : Апрель 08, 2010, 08:43 »

Код:
QSqlDatabase *db;
совсем не обязательно объявлять в конструкторе.... если используется одно подключение.. то все твои запросы будут использовать его по умолчанию.... т.е. достаточно просто открыть базу до начала выполнения запросов.... к тому же экземпляр бд всегда можно получить с помощью
Код:
QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true )   [static]
Записан
ROKR
Гость
« Ответ #10 : Апрель 08, 2010, 19:35 »

Код:
QSqlDatabase *db;
совсем не обязательно объявлять в конструкторе.... если используется одно подключение.. то все твои запросы будут использовать его по умолчанию.... т.е. достаточно просто открыть базу до начала выполнения запросов.... к тому же экземпляр бд всегда можно получить с помощью
Код:
QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true )   [static]

Спасибо за разъяснения! Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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