crossplatform.ru

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

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Хранимы процедуры, Как получить набор данных
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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
amakaro4
  опции профиля:
сообщение 29.9.2009, 11:09
Сообщение #2


Студент
*

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

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




Репутация:   0  


Забыл добавить что за основу взял пример работы с QSqlRelationalTableModel
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 29.9.2009, 11:19
Сообщение #3


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

Группа: Модератор
Сообщений: 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
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 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
Сообщение #5


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

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

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




Репутация:   44  


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

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


Студент
*

Группа: Новичок
Сообщений: 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
Сообщение #7


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

Группа: Участник
Сообщений: 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
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 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();
}

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


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

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

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




Репутация:   44  


Ты предыдущий пост не читал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
amakaro4
  опции профиля:
сообщение 29.9.2009, 13:26
Сообщение #10


Студент
*

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

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




Репутация:   0  


Цитата(BRE @ 29.9.2009, 14:23) *
Ты предыдущий пост не читал?


Читал... Флаг проставлен, все прописано... Если чего-то не догоняю - Объясни пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 26.12.2024, 23:22