crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Хранимы процедуры, Как получить набор данных
amakaro4
  опции профиля:
сообщение 29.9.2009, 10:38
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 28.9.2009
Пользователь №: 1123

Спасибо сказали: 0 раз(а)




Репутация:   0  


Сражу скажу. Я новичек. До этого пять лет работал со студией (C#). Сейчас на примере сделанного когда-то проекта решил изучить С и QT... Но дело в том что с годами сложилось, по определенным причинам, правило работать по возможности только с хранимыми процедурами. В ADO.NET с этим проблем нет но вот уже сутки бьюсь над попыткой залить таблицу из процедуры...

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
db.setDatabaseName( "DRIVER={SQL Native Client};Server=BI8;Database=SURS2001;Trusted_Connection=yes;" );

и так далее.........
Причем
model->setTable("License"); //обращение к самой таблице
model->select();

работает корректно и прекрасно заполняет таблицу
Пробовал:
QSqlQuery query;
query.prepare( "exec src_License" );
query.exec();

И
query.prepare("{CALL src_License}");

ничто не вызывает ошибок, но в таблицу ничего не поподает...
попытка же сделать
model->setQuery(query);

вызывает ошибку.....

В документации нашел только описания получения одиночного результата, и ни одного примера с получением набора данных их процедуры....
Подскажите пожалуйста. Что делаю не так?
Причина редактирования: используй тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ViGOur
  опции профиля:
сообщение 29.9.2009, 11:19
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата
With Microsoft SQL Server the result set returned by a stored procedure that uses the return statement, or returns multiple result sets, will be accessible only if you set the query's forward only mode to forward using QSqlQuery::setForwardOnly().

 \\ STORED_PROC uses the return statement or returns multiple result sets
QSqlQuery query;
query.setForwardOnly(true);
query.exec("{call STORED_PROC}");


Note: The value returned by the stored procedure's return statement is discarded. If the stored procedure returns multiple result sets only the first will be accessible.
это цитата из документации: Поддержка хранимых процедур в ODBC

Сообщение отредактировал ViGOur - 29.9.2009, 11:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
amakaro4
  опции профиля:
сообщение 29.9.2009, 12:12
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 28.9.2009
Пользователь №: 1123

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ViGOur @ 29.9.2009, 12:19) *
Цитата
With Microsoft SQL Server the result set returned by a stored procedure that uses the return statement, or returns multiple result sets, will be accessible only if you set the query's forward only mode to forward using QSqlQuery::setForwardOnly().

 \\ STORED_PROC uses the return statement or returns multiple result sets
QSqlQuery query;
query.setForwardOnly(true);
query.exec("{call STORED_PROC}");


Note: The value returned by the stored procedure's return statement is discarded. If the stored procedure returns multiple result sets only the first will be accessible.
это цитата из документации: Поддержка хранимых процедур в ODBC



query.setForwardOnly(true);

у меня прописан. Но вопрос остается в сидле...
как результат query в модель запихнуть если она корректно рабоатет только с setTable и селект?

Я только вчера внимательно прочел про Модель/Представление и возможно я чего-то не понимаю. Поэтому приведу кусок кода побольше. (убрал только проверки)

QTableView *createView(const QString &title, QSqlTableModel *model)
{
//! [4]
QTableView *view = new QTableView;
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view));
//! [4]
view->setWindowTitle(title);
return view;
}

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
db.setDatabaseName(":memory:");
db.setHostName("HOST_NAME");
db.setDatabaseName("ODBC_NAME");
db.setUserName("username");
db.setPassword("userpass");

QSqlRelationalTableModel model;

/* ПРЕКРАСНО РАБОТАЕТ
model->setTable("License");
model->select();
*/

QSqlQuery query;
query.setForwardOnly(true);
query.exec("{call src_License}");

/*
КАК ТЕПЕРЬ query ПЕРЕДАТЬ в model?
*/

QTableView *view = createView(QObject::tr("Relational Table Model"), &model);
view->show();

return app.exec();
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 29.9.2009, 12:14
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(amakaro4 @ 29.9.2009, 13:12) *
/*
КАК ТЕПЕРЬ query ПЕРЕДАТЬ в model?
*/

посмотри на класс QSqlQueryModel.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
amakaro4
  опции профиля:
сообщение 29.9.2009, 12:44
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 28.9.2009
Пользователь №: 1123

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(BRE @ 29.9.2009, 13:14) *
Цитата(amakaro4 @ 29.9.2009, 13:12) *
/*
КАК ТЕПЕРЬ query ПЕРЕДАТЬ в model?
*/

посмотри на класс QSqlQueryModel.


Я смотрел...
Все дело в том что QSqlRelationalTableModel обладает теми же своиствами что и QSqlQueryModel.

Создал процедуру с параметром QSqlQueryModel и передаю в нее QSqlRelationalTableModel
в ней выполняю:

model->query().setForwardOnly(true);
model->setQuery("{call src_License}");
model->query().exec();

Теперь у меня есть заголовки таблицы но нет содержимого...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 29.9.2009, 12:54
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


// Установил флаг для текущего объекта QSqlQuery
model->query().setForwardOnly(true);
// Создал новый(!) объект QSqlQuery с заданной строкой и сделал его текущим (Заметь у нового запроса флаг forwardOnly по умолчанию выключен)
model->setQuery("{call src_License}");
// Выполнил новый запрос
model->query().exec();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
amakaro4
  опции профиля:
сообщение 29.9.2009, 13:21
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 28.9.2009
Пользователь №: 1123

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(BRE @ 29.9.2009, 13:54) *
// Установил флаг для текущего объекта QSqlQuery
model->query().setForwardOnly(true);
// Создал новый(!) объект QSqlQuery с заданной строкой и сделал его текущим (Заметь у нового запроса флаг forwardOnly по умолчанию выключен)
model->setQuery("{call src_License}");
// Выполнил новый запрос
model->query().exec();


Упростил до безобразия

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
if (!createConnection())
return 1;


QSqlQueryModel model;

model.query().setForwardOnly(true);
model.setQuery("{call src_License}");
model.query().exec();

QTableView *view = new QTableView;
view->setModel(&model);
//view->setItemDelegate(new QSqlQueryModel(view));
view->show();

return app.exec();
}

В таблице сформированы заголовки но количество строк равно нулю. Трасировщик показывает что данные отдавались...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- amakaro4   Хранимы процедуры   29.9.2009, 10:38
- - amakaro4   Забыл добавить что за основу взял пример работы с ...   29.9.2009, 11:09
- - ViGOur   ЦитатаWith Microsoft SQL Server the result set ret...   29.9.2009, 11:19
|- - amakaro4   Цитата(ViGOur @ 29.9.2009, 12:19) ЦитатаW...   29.9.2009, 12:12
|- - BRE   Цитата(amakaro4 @ 29.9.2009, 13:12) /* КА...   29.9.2009, 12:14
|- - amakaro4   Цитата(BRE @ 29.9.2009, 13:14) Цитата(ama...   29.9.2009, 12:44
|- - BRE   // Установил флаг для текущего объекта QSqlQuery m...   29.9.2009, 12:54
|- - amakaro4   Цитата(BRE @ 29.9.2009, 13:54) // Установ...   29.9.2009, 13:21
|- - BRE   Ты предыдущий пост не читал?   29.9.2009, 13:23
|- - amakaro4   Цитата(BRE @ 29.9.2009, 14:23) Ты предыду...   29.9.2009, 13:26
|- - BRE   Цитата(amakaro4 @ 29.9.2009, 14:26) Читал...   29.9.2009, 13:34
|- - amakaro4   Цитата(BRE @ 29.9.2009, 14:34) Цитата(ama...   29.9.2009, 13:41
- - BRE   Я там дописал свой предыдущий пост. Посмотри. Дума...   29.9.2009, 13:45
|- - amakaro4   Цитата(BRE @ 29.9.2009, 14:45) Я там допи...   29.9.2009, 13:55
|- - BRE   Я правильно понимаю, что сам запрос отрабатывает н...   29.9.2009, 14:08
|- - amakaro4   Цитата(BRE @ 29.9.2009, 15:08) qDebug() ...   29.9.2009, 14:38
|- - BRE   Упс, это я не досмотрел, что для QSqlQuery не пред...   29.9.2009, 14:38
- - amakaro4   Запускается C:\Qt\2009.03\qt\e...   29.9.2009, 14:41
|- - BRE   Цитата(amakaro4 @ 29.9.2009, 15:41) Запус...   29.9.2009, 14:48
|- - amakaro4   Цитата(BRE @ 29.9.2009, 15:48) Цитата(ama...   29.9.2009, 15:02
|- - BRE   Цитата(amakaro4 @ 29.9.2009, 16:02) true ...   29.9.2009, 15:07
|- - amakaro4   Цитата(BRE @ 29.9.2009, 16:07) Цитата(ama...   29.9.2009, 15:10
|- - BRE   Цитата(amakaro4 @ 29.9.2009, 16:10) Сами ...   29.9.2009, 15:52
- - Litkevich Yuriy   Цитата(amakaro4 @ 29.9.2009, 19:02) {call...   29.9.2009, 15:55
|- - amakaro4   Цитата(Litkevich Yuriy @ 29.9.2009, 16:55...   29.9.2009, 15:59
- - Litkevich Yuriy   Например, я при работе с firebird, через ODBC. Исп...   29.9.2009, 16:03
|- - amakaro4   Цитата(Litkevich Yuriy @ 29.9.2009, 17:03...   29.9.2009, 16:18
- - Litkevich Yuriy   amakaro4, перестань цитировать целыми сообщениями....   29.9.2009, 16:24
|- - amakaro4   Цитата(Litkevich Yuriy @ 29.9.2009, 17:24...   29.9.2009, 16:35
- - Litkevich Yuriy   Цитата(amakaro4 @ 29.9.2009, 20:35) возвр...   29.9.2009, 16:44
- - amakaro4   все тоже самое.... прямой запрос к таблице - данн...   29.9.2009, 16:56
|- - BRE   Цитата(amakaro4 @ 29.9.2009, 17:56) попро...   29.9.2009, 17:11
- - amakaro4   все тоже самое....   29.9.2009, 17:17
|- - BRE   Цитата(amakaro4 @ 29.9.2009, 18:17) все т...   29.9.2009, 17:33
- - Litkevich Yuriy   Я думаю, что нужно драйвер мускула для Qt собрать....   29.9.2009, 17:36
- - amakaro4   Уточни пожалуйста на тему переопределить. QT посл...   29.9.2009, 17:51
- - Гость   Проверь саму хранимую процедуру T-SQL. Если у тебя...   6.10.2010, 12:22


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 15:05