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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов хранимой процедуры с параметрами (QMYSQL)  (Прочитано 6846 раз)
Mechanik
Гость
« : Октябрь 26, 2010, 12:17 »

При вызове хранимой процедуры MySQL с предварительным использованием QSqlQuery::prepare()  не удается получить возвращаемый ей набор данных.
Код хранимой процедуры:
Код:
CREATE PROCEDURE test(prm int)
BEGIN
  select prm from dual;
end
Код программы:
Код:
#include <QtSql>
int main(int argc, char *argv[])
{
    QSqlDatabase db;
    db=QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("testdb");
    db.setUserName("test");
    db.setPassword("test");
    if(!db.open()) qDebug() << db.lastError();
    QSqlQuery query;

     // 1-й вариант:
    if(!query.prepare("call test(:prm)")) qDebug() << query.lastError();
    query.bindValue(":prm",999);
    if(!query.exec()) qDebug() << query.lastError();

    /* // 2-й вариант:
    if(!query.exec("call test(999)")) qDebug() << query.lastError();
    */

    qDebug() << "size:" << query.size();
    while(query.next()) qDebug() << query.value(0);
    db.close();
}
При запуске в 1-м варианте набор данных пуст: query.size() возвращает "-1", query.next() - false. При этом сама процедура вызывается, проверено.
При запуске во 2-м варианте, где тот же самый запрос выполняется с явной передачей значения параметра в exec, query.size() возвращает 1, query.next() - true, результат выводится.
Вопрос - можно ли и каким образом обработать набор данных, возвращаемый процедурой, при использовании связывания параметров?
Поиск особых результатов не дал, кроме, разве что http://lists.trolltech.com/pipermail/qt-interest/2008-December/000190.html, там решения нет.
mysql  Ver 14.14 Distrib 5.1.39, for redhat-linux-gnu (i386) using readline 5.1
qt 4.6.2
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Октябрь 26, 2010, 12:21 »

void QSqlQuery::bindValue ( const QString & placeholder, const QVariant & val, QSql::ParamType paramType)
Не оно?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Mechanik
Гость
« Ответ #2 : Октябрь 26, 2010, 12:26 »

void QSqlQuery::bindValue ( const QString & placeholder, const QVariant & val, QSql::ParamType paramType)
Не оно?
Значение paramType по умолчанию QSql::In, что в данном случае вполне устраивает. Нужно обработать не значение параметра, а возвращаемый процедурой набор.
Записан
Mechanik
Гость
« Ответ #3 : Октябрь 26, 2010, 12:37 »

При использовании драйвера ODBC первый вариант работает - query.next() - true, хоть query.size() и возвращает -1.
« Последнее редактирование: Октябрь 26, 2010, 12:40 от Mechanik » Записан
crossly
Гость
« Ответ #4 : Октябрь 27, 2010, 16:26 »

ответ есть в ассистенте...
Записан
Mechanik
Гость
« Ответ #5 : Ноябрь 11, 2010, 13:19 »

ответ есть в ассистенте...
Вы имеете в виду эту http://doc.qt.nokia.com/4.6/sql-driver.html#qmysql-stored-procedure-support статью?
Цитировать
MySQL 5 introduces stored procedure support at the SQL level, but no API to control IN, OUT and INOUT parameters. Therefore, parameters have to be set and read using SQL commands instead of QSqlQuery::bindValue().
Смущает, что значения параметров при этом в хп передаются, хотя как-бы не должны... Думал, может, есть какой-то удобный workaround, кроме переменных в sql.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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