Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT] набор данных из хранимой процедуры


Автор: MasterZiv 10.4.2013, 18:55
QT 4.8.
Нужно получить набор данных из хранимой процедуры и отобразить его в гриде.
сервер -- MySQL, но думаю это не очень важно.
Без процедуры всё работает и показывает. 
С процедурой -- фиг.

Ключевой кусок кода:

Код

void MainWindow::init()
{
    // -- dont use this -- query.setForwardOnly(true);
    //query.prepare("select * from MSG");
    query.prepare("CALL getLastMsg( ? )");
    query.bindValue(0,"20");
    if (!query.exec())
    {
            qDebug() << "getLastMsg() failed: " << query.lastError().text();
    }

    unsigned ncols = query.record().count();
    while( query.next() )
    {
        for( unsigned i = 0; i < ncols; ++i )
        {
          if( i )
              qDebug() << " | ";
          qDebug() << query.value(i).toString();
        }
        qDebug() << '\n';
    }

    msg_data.setQuery( query );

    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("MSG_ID") );
    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("MSG_DATE") );
    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("USER") );
    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("SEVERITY") );
    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("MSG") );
    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("WK_SYSTEM_CODE") );
    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("WK_PROCESS_CODE") );
    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("WK_COMPONENT_CODE") );
    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("COMPONENT_INSTANCE_ID") );
    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("WK_OBJECT_CODE") );
    msg_data.setHeaderData( 0, Qt::Horizontal, QObject::tr("WK_OBJECT_NICKNAME") );

    ui->tableView->setModel(&msg_data);
}


Соответственно, если использовать эту строку кода,
Код

query.prepare("select * from MSG");

то всё ОК,
а если две строки ниже -- фиг, там даже набор данных не виден.
Процедура естественно отдельно от данного клиента работает, проверена. Возвращает тот же набор данных.

Видно что-то вообще не так...

Автор: Snake174 11.4.2013, 04:47
http://doc.qt.digia.com/4.6/sql-driver.html#qmysql-stored-procedure-support

Автор: Guinness 11.4.2013, 07:29
Было бы хорошо код хранимой процедуры посмотреть. Вы её из mysql консоли запускали, работала?

Автор: MasterZiv 11.4.2013, 10:37
Цитата(Guinness @ 11.4.2013,  07:29)
Было бы хорошо код хранимой процедуры посмотреть. Вы её из mysql консоли запускали, работала?

Я же написал.

Цитата

Процедура естественно отдельно от данного клиента работает, проверена. Возвращает тот же набор данных.


Добавлено через 2 минуты и 54 секунды
Цитата(Snake174 @ 11.4.2013,  04:47)
http://doc.qt.digia.com/4.6/sql-driver.html#qmysql-stored-procedure-support

Нет, не поможет.
Там вообще ничего нет по теме. Там всё только про выходные параметры, которые не поддерживаются.

Автор: Guinness 11.4.2013, 11:02
Я к чему спросил, Вы туда параметр передаете. А в запросе никаких параметров не нужно.
MySQL работает удаленно? 
Может у Вас нет привилегий на определенные операции, которые есть в хранимой процедуре?

Ещё setHeaderData у Вас всегда к первой колонке применяется.

Автор: MasterZiv 11.4.2013, 13:04
Цитата

Я к чему спросил, Вы туда параметр передаете. А в запросе никаких параметров не нужно.
MySQL работает удаленно? 
Может у Вас нет привилегий на определенные операции, которые есть в хранимой процедуре?


Да есть всё. Убирал я параметр, добавлял -- один хрен.
Эта сволочь просто не приемлит подготовленное выполнение вызовов хранимок.

Надо так:
Код

    QString q;
    q.sprintf( "CALL getLastMsg(%d)", 20 );
    if (!query.exec( q ) )
    {
            qDebug() << "getLastMsg() failed: " << query.lastError().text();
    }

    unsigned ncols = query.record().count();
    while( query.next() )
    {
        for( unsigned i = 0; i < ncols; ++i )
        {
          if( i )
              qDebug() << " | ";
          qDebug() << query.value(i).toString();
        }
        qDebug() << '\n';
    }




Цитата

Ещё setHeaderData у Вас всегда к первой колонке применяется.


Это не важно, об этом -- позже. Чё-то оно показывает и в таком виде -- и ладно.

Автор: Guinness 11.4.2013, 14:11
К несчастью, на работе у меня нет исходников, с которыми я работал с MySQL, приду посмотрю в чем у нас различия, ибо у меня все прекрасно работало.

А с этим все нормально?
Цитата(Guinness @  11.4.2013,  11:02 Найти цитируемый пост)
MySQL работает удаленно? Может у Вас нет привилегий на определенные операции, которые есть в хранимой процедуре?


Хотя, я вот сейчас ещё раз на Ваш последний пример посмотрел, очень похоже, что хранимые процедуры я вызывал именно таким образом. Сам расставлял кавычки, где нужно и т.п.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)