Russian Qt Forum

Qt => Базы данных => Тема начата: Mechanik от Октябрь 26, 2010, 12:17



Название: Вызов хранимой процедуры с параметрами (QMYSQL)
Отправлено: 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 (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


Название: Re: Вызов хранимой процедуры с параметрами (QMYSQL)
Отправлено: Пантер от Октябрь 26, 2010, 12:21
void QSqlQuery::bindValue ( const QString & placeholder, const QVariant & val, QSql::ParamType paramType)
Не оно?


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


Название: Re: Вызов хранимой процедуры с параметрами (QMYSQL)
Отправлено: Mechanik от Октябрь 26, 2010, 12:37
При использовании драйвера ODBC первый вариант работает - query.next() - true, хоть query.size() и возвращает -1.


Название: Re: Вызов хранимой процедуры с параметрами (QMYSQL)
Отправлено: crossly от Октябрь 27, 2010, 16:26
ответ есть в ассистенте...


Название: Re: Вызов хранимой процедуры с параметрами (QMYSQL)
Отправлено: Mechanik от Ноябрь 11, 2010, 13:19
ответ есть в ассистенте...
Вы имеете в виду эту http://doc.qt.nokia.com/4.6/sql-driver.html#qmysql-stored-procedure-support (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.