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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: хранимая процедура и qt  (Прочитано 7744 раз)
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();

Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Сентябрь 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);
Записан
ksv-uk
Гость
« Ответ #2 : Сентябрь 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();
 
 
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #3 : Сентябрь 14, 2015, 10:12 »

процедура вообще отрабатывает?
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #4 : Сентябрь 14, 2015, 10:17 »

Сам не работаю с моделью QSqlQueryModel, но мне кажется с ней надо чуток по-другому работать.
Метод exec вызывается непосредственно самой моделью. Не уверен, что эта модель понимает параметризованные запросы.
Записан
ksv-uk
Гость
« Ответ #5 : Сентябрь 14, 2015, 10:24 »

процедура вообще отрабатывает?
да, процедура отрабатывается

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


« Последнее редактирование: Сентябрь 14, 2015, 10:30 от ksv-uk » Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #6 : Сентябрь 14, 2015, 10:32 »

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

Еще можно попробовать сначала создать QSqlQuery, настроить, выполнить, потом установить этот query в вашу модель:
Код:
void QSqlQueryModel::setQuery(const QSqlQuery & query)

сделал как вы советовали, уже хотя бы заголовки выводятся Смеющийся

Код
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();
 
 
 


Записан
ksv-uk
Гость
« Ответ #8 : Сентябрь 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;
      }
 
 
 
 
так вот значения возвращаются. Значит проблема с моделью Непонимающий?
Записан
ksv-uk
Гость
« Ответ #9 : Сентябрь 14, 2015, 14:29 »

Код
C++ (Qt)
qDebug() << model->rowCount();
qDebug() << model->columnCount();
 

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

пока не могу понять
Записан
chagovets
Новичок

Offline Offline

Сообщений: 24


Просмотр профиля
« Ответ #10 : Сентябрь 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
Записан
Nidxogg
Гость
« Ответ #11 : Сентябрь 22, 2015, 18:53 »

В Postgresql вызываю так, может подойдет
Код:
    QSqlQuery query;
    query.prepare("SELECT procedure_name (:parametr)");
    query.bindValue(":parametr",myValue);
   query.exec()

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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