Хранимы процедуры, Как получить набор данных |
Здравствуйте, гость ( Вход | Регистрация )
Хранимы процедуры, Как получить набор данных |
amakaro4 |
29.9.2009, 10:38
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 18 Регистрация: 28.9.2009 Пользователь №: 1123 Спасибо сказали: 0 раз(а) Репутация: 0 |
Сражу скажу. Я новичек. До этого пять лет работал со студией (C#). Сейчас на примере сделанного когда-то проекта решил изучить С и QT... Но дело в том что с годами сложилось, по определенным причинам, правило работать по возможности только с хранимыми процедурами. В ADO.NET с этим проблем нет но вот уже сутки бьюсь над попыткой залить таблицу из процедуры...
и так далее......... Причем
работает корректно и прекрасно заполняет таблицу Пробовал:
И
ничто не вызывает ошибок, но в таблицу ничего не поподает... попытка же сделать
вызывает ошибку..... В документации нашел только описания получения одиночного результата, и ни одного примера с получением набора данных их процедуры.... Подскажите пожалуйста. Что делаю не так?
Причина редактирования: используй тэг 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(). это цитата из документации: Поддержка хранимых процедур в ODBC
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. Сообщение отредактировал ViGOur - 29.9.2009, 11:19 |
|
|
amakaro4 |
29.9.2009, 12:12
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 18 Регистрация: 28.9.2009 Пользователь №: 1123 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата 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(). это цитата из документации: Поддержка хранимых процедур в ODBC
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. 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, 12:44
Сообщение
#5
|
Студент Группа: Новичок Сообщений: 18 Регистрация: 28.9.2009 Пользователь №: 1123 Спасибо сказали: 0 раз(а) Репутация: 0 |
/* КАК ТЕПЕРЬ 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 |
// Установил флаг для текущего объекта 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(); } В таблице сформированы заголовки но количество строк равно нулю. Трасировщик показывает что данные отдавались... |
|
|
Текстовая версия | Сейчас: 27.12.2024, 15:05 |