Russian Qt Forum

Qt => Базы данных => Тема начата: ksv-uk от Сентябрь 14, 2015, 09:29



Название: хранимая процедура и qt
Отправлено: ksv-uk от Сентябрь 14, 2015, 09:29
Уважаемые коллеги, необходима ваша помощь

Использую MS SQL 2008. Вызываю хранимку с параметром. Компиляция происходит без ошибок, но запрос ничего не возвращает (с харнимай процедурой все в порядке)
Что я делаю не так?

Код:
    QSqlQueryModel *model = new QSqlQueryModel;

    model->query().prepare("{call gen_mom_plan(plan_dt)}");
    model->query().bindValue("plan_dt","09.07.2015");
    model->query().exec();

    QTableView *tableview = new QTableView;
    tableview->setModel(model);

    tableview->show();



Название: Re: хранимая процедура и qt
Отправлено: Johnik от Сентябрь 14, 2015, 09:55
Что я делаю не так?
не читаете документацию

попробуйте так:
Код
C++ (Qt)
   model->query().prepare("{call gen_mom_plan(:plan_dt)}");
   model->query().bindValue(":plan_dt","09.07.2015");

и возможно понадобится:
Код
C++ (Qt)
  model->query().setForwardOnly(true);


Название: Re: хранимая процедура и qt
Отправлено: ksv-uk от Сентябрь 14, 2015, 10:00
Что я делаю не так?
не читаете документацию

попробуйте так:
Код
C++ (Qt)
   model->query().prepare("{call gen_mom_plan(:plan_dt)}");
   model->query().bindValue(":plan_dt","09.07.2015");

и возможно понадобится:
Код
C++ (Qt)
  model->query().setForwardOnly(true);


Спасибо, Johnic. Я так пробовал, эффект тот же самый, т.е. нет ошибок и ничего не возвращается
Код
C++ (Qt)
 
QSqlQueryModel *model = new QSqlQueryModel;
 
 
   model->query().prepare("{call gen_mom_plan(:plan_dt)}");
   model->query().bindValue(":plan_dt","09.07.2015");
    model->query().setForwardOnly(true);
 
   model->query().exec();
 
 
 
 
 
   QTableView *tableview = new QTableView;
   tableview->setModel(model);
 
   tableview->show();
 
 


Название: Re: хранимая процедура и qt
Отправлено: Johnik от Сентябрь 14, 2015, 10:12
процедура вообще отрабатывает?


Название: Re: хранимая процедура и qt
Отправлено: Johnik от Сентябрь 14, 2015, 10:17
Сам не работаю с моделью QSqlQueryModel, но мне кажется с ней надо чуток по-другому работать.
Метод exec вызывается непосредственно самой моделью. Не уверен, что эта модель понимает параметризованные запросы.


Название: Re: хранимая процедура и qt
Отправлено: ksv-uk от Сентябрь 14, 2015, 10:24
процедура вообще отрабатывает?
да, процедура отрабатывается

вот результат выполнения в среде management studio, т.е. проблема не с хранимкой.




Название: Re: хранимая процедура и qt
Отправлено: Johnik от Сентябрь 14, 2015, 10:32
Еще можно попробовать сначала создать QSqlQuery, настроить, выполнить, потом установить этот query в вашу модель:
Код:
void QSqlQueryModel::setQuery(const QSqlQuery & query)


Название: Re: хранимая процедура и qt
Отправлено: ksv-uk от Сентябрь 14, 2015, 10:44
Еще можно попробовать сначала создать QSqlQuery, настроить, выполнить, потом установить этот query в вашу модель:
Код:
void QSqlQueryModel::setQuery(const QSqlQuery & query)

сделал как вы советовали, уже хотя бы заголовки выводятся ;D

Код
C++ (Qt)
QSqlQueryModel *model = new QSqlQueryModel;
 
 
   QSqlQuery query;
 
   query.prepare("{ CALL gen_mom_plan (?) }");
 
   QVariant plan_dt = "09.07.2015";
   query.bindValue(0, plan_dt);
   query.exec();
 
 
  model->setQuery(query);
 
 
   QTableView *tableview = new QTableView;
   tableview->setModel(model);
 
   tableview->show();
 
 
 




Название: Re: хранимая процедура и qt
Отправлено: ksv-uk от Сентябрь 14, 2015, 13:56

К существующему коду

Код
C++ (Qt)
QSqlQueryModel *model = new QSqlQueryModel;
 
   QSqlQuery query;
   query.prepare("{ CALL gen_mom_plan (?) }");
 
   QVariant plan_dt = "09.07.2015";
   query.bindValue(0, plan_dt);
   query.exec();
 
   model->setQuery(query);
 
 
   QTableView *tableview = new QTableView;
   tableview->setModel(model);
 
   tableview->show();
 
 

добавил следующий код. чтобы посмотреть результаты
Код
C++ (Qt)
 
 
   while (query.next()) {
        int norm_id = query.value(0).toInt();
        int obj_key = query.value(1).toInt();
        qDebug() << norm_id << obj_key;
      }
 
 
 
 
так вот значения возвращаются. Значит проблема с моделью ????


Название: Re: хранимая процедура и qt
Отправлено: ksv-uk от Сентябрь 14, 2015, 14:29
Код
C++ (Qt)
qDebug() << model->rowCount();
qDebug() << model->columnCount();
 

очень странно:
model->rowCount() =0, model->columnCount()=41

пока не могу понять


Название: Re: хранимая процедура и qt
Отправлено: chagovets от Сентябрь 20, 2015, 20:57
QSqlQueryModel не поддерживает forward-only запросов.
в исходниках QSqlQueryModel::setQuery()
Код:
347  if (!query.isActive() || query.isForwardOnly()) {
348  d->atEnd = true;
349  d->bottom = QModelIndex();
350  if (query.isForwardOnly())
351  d->error = QSqlError(QLatin1String("Forward-only queries "
352  "cannot be used in a data model"),
353  QString(), QSqlError::ConnectionError);
354  else
355  d->error = query.lastError();
356  return;
357  }
сам сталкивался с подобным http://www.prog.org.ru/topic_21253_0.html (http://www.prog.org.ru/topic_21253_0.html)


Название: Re: хранимая процедура и qt
Отправлено: Nidxogg от Сентябрь 22, 2015, 18:53
В Postgresql вызываю так, может подойдет
Код:
    QSqlQuery query;
    query.prepare("SELECT procedure_name (:parametr)");
    query.bindValue(":parametr",myValue);
   query.exec()