Russian Qt Forum

Qt => Базы данных => Тема начата: ROKR от Апрель 07, 2010, 15:46



Название: Сброс данных из QSqlQueryModel при вызове хранимой процедуры
Отправлено: ROKR от Апрель 07, 2010, 15:46
В одном окне имеется QSqlQueryModel, которая выполняет запрос данных из представления. Данные выводятся в QTabelView. В другом окне через QSqlQuery происходит вызов хранимой процедуры ("EXEC ..."), после чего все данные в QSqlQueryModel из первого окна теряются.  Это можно как-то исправить?


Название: Re: Сброс данных из QSqlQueryModel при вызове хранимой процедуры
Отправлено: crossly от Апрель 07, 2010, 15:54
исправить можно.... код покажи....


Название: Re: Сброс данных из QSqlQueryModel при вызове хранимой процедуры
Отправлено: lit-uriy от Апрель 07, 2010, 15:57
как я понимаю, всё сидит на одном соединении с БД.


Название: Re: Сброс данных из QSqlQueryModel при вызове хранимой процедуры
Отправлено: ROKR от Апрель 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())...


Название: Re: Сброс данных из QSqlQueryModel при вызове хранимой процедуры
Отправлено: ROKR от Апрель 07, 2010, 15:59
как я понимаю, всё сидит на одном соединении с БД.

Да. Стоить сделать второе подключение?


Название: Re: Сброс данных из QSqlQueryModel при вызове хранимой процедуры
Отправлено: crossly от Апрель 07, 2010, 16:17
а что есть *db... и как query объявлен??


Название: Re: Сброс данных из QSqlQueryModel при вызове хранимой процедуры
Отправлено: ROKR от Апрель 07, 2010, 16:36
а что есть *db... и как query объявлен??

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

Код:
QSqlDatabase *db;

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

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

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

Забыл, что в еще одном классе тоже вызываю хранимую процедуру, но такой ошибки не происходит.
Провел еще пару опытов и заметил, что:
1) После потери данных такое ощущение, что теряется коннект к базе, потому что другие окна с обычными QSqlRelationTabelModel не могут открыть таблицы.
2) Если эта хранимая процедура возвращает NULL, то данные не теряются.


Название: Re: Сброс данных из QSqlQueryModel при вызове хранимой процедуры
Отправлено: ROKR от Апрель 07, 2010, 17:24
В других местах программы вызов этой хранимой процедуры также сопровождается потерей данных.


Название: Re: Сброс данных из QSqlQueryModel при вызове хранимой процедуры
Отправлено: ROKR от Апрель 07, 2010, 17:45
В output вывалилась ошибка "Подключение занято до получения результатов для другого HSTMT". Подправил хранимию процедуру, и все заработало  ::) Всем спасибо!


Название: Re: Сброс данных из QSqlQueryModel при вызове хранимой процедуры
Отправлено: crossly от Апрель 08, 2010, 08:43
Код:
QSqlDatabase *db;
совсем не обязательно объявлять в конструкторе.... если используется одно подключение.. то все твои запросы будут использовать его по умолчанию.... т.е. достаточно просто открыть базу до начала выполнения запросов.... к тому же экземпляр бд всегда можно получить с помощью
Код:
QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true )   [static]


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

Спасибо за разъяснения! :)