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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QODBC + MSSQL пустые строки в возвращаемых параметрах?  (Прочитано 13861 раз)
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #15 : Июнь 16, 2009, 01:47 »

Вдруг чем то поможет

При написании ХП на Firebird для того чтобы хранимая процедура вернула набор данных надо использовать оператор SUSPEND; Не знаю нужен ли что-то подобное в MySQL.

чтобы вызвать хранимую процедуру через query

Код
C++ (Qt)
QSqlQuery query;
query.prepare( "select FIELD_1, FIELD_2 from SP_STORED_PROC( :PARAM_1, :PARAM_2 ) " );
query.bindValue( ":PARAM_1", 666 );
query.bindValue( ":PARAM_2", 999 );
query.exec();
 
query.first(); //
 
QSqlRecord rec = query.record();
 
qDebug() << query.value( rec.indexOf("FIELD_1") );
qDebug() << query.value( rec.indexOf("FIELD_2") );

мы всегда можем написать ХП чтобы она возвращала хотя бы 1 запись, но можно и проверять что после first набор установлен на валидную запись

Я такое использую - у меня работает
Записан
rusvid
Гость
« Ответ #16 : Сентябрь 08, 2009, 05:01 »

Использую  Qt v4.5.1. Через драйвер QODBC обращаюсь к БД MS SQL Server, вызываю хранимую процедуру. Хранимая процедура возвращает значения через параметры. Если парметр типа QString (NVARCHAR для MSSQL) то всегда возвращается пустая строка.

Аналогичная проблема, удалось найти решение ?
вызов процедуры у меня происходит через CALL, но результат тот же самый - для строковых параметров возвращается пустая строка
Код:
    QSqlQuery query;
    query.setForwardOnly(true);
    query.prepare("{CALL fp_test(?,?,?)}");
    query.addBindValue(strName);
    query.addBindValue(strValue,QSql::Out);
    query.addBindValue(n,QSql::Out);
    if (!query.exec())
    {QMessageBox::information(0, QObject::tr("Error"), "Ошибка");
      return 1;
    }

    strValue = query.boundValue(1).toString();
    n = query.boundValue(2).toInt();;

    QMessageBox::information(0, QString().setNum(n), strValue);

Записан
Vexator
Гость
« Ответ #17 : Сентябрь 08, 2009, 05:52 »

А разве можно использовать exec() без first() или next() ? сколько работаю с qsql всегда их использую...
Записан
rusvid
Гость
« Ответ #18 : Сентябрь 08, 2009, 06:07 »

А разве можно использовать exec() без first() или next() ? сколько работаю с qsql всегда их использую...
Вроде можно.
Смотри пример AsciiToInt на http://doc.trolltech.com/4.5/qsqlquery.html

Если хранимая процедура не возвращает результирующий набор, а только изменяет параметры,
то вполне логично, что нет необходимости в first() и next().
Записан
Vexator
Гость
« Ответ #19 : Сентябрь 08, 2009, 06:30 »

Если хранимая процедура не возвращает результирующий набор, а только изменяет параметры,
то вполне логично, что нет необходимости в first() и next().
а да, забыл уточнить Улыбающийся
имел виду операции чтения
Записан
mik1133
Гость
« Ответ #20 : Октябрь 08, 2009, 13:44 »

Снова всем привет!
Возвращаюсь к поднятой теме. На сайт разработчиков Qt было отправлено письмо об этой проблеме и вот наконец-то их ответ, цитирую:

. . .

Thankyou for your bug report, it has been entered into our system and will be available via http://bugreports.qt.nokia.com/browse/QTBUG-4634 when the new system goes live.

. . .

Thanks,
Bill
--
Bill King, Software Engineer
Qt Development Frameworks, Nokia Pty Ltd Brisbane Office


Будьте внимательны к новым продуктам  Улыбающийся, особенно к free software

Всем удачи!
Записан
rusvid
Гость
« Ответ #21 : Октябрь 28, 2009, 06:37 »

В общем, решение было найдено.
Необходимо выделить место под возвращаемый параметр.
Т.е. если параметр "@Value varchar(50) out,"
делаем в программе strValue.reserve(51);

Полный пример:
Код:
    QString strName = "QSql::In string";
    QString strValue;
    strValue.reserve(51);
    int n = 0;

    QSqlQuery query;
    //query.setForwardOnly(true);
    query.prepare("{CALL fp_test(?,?,?)}");
    query.bindValue("Name",strName);
    query.bindValue("Value", strValue,QSql::Out);
    query.bindValue("Number",n,QSql::Out);
    if (!query.exec())
    { QMessageBox::information(0, QObject::tr("Error"), "Ошибка");
      return 1;
    }

    strName = query.boundValue("Name").toString();  // "QSql::In string"
    strValue = query.boundValue("Value").toString();  // "test"
    n = query.boundValue("Number").toInt();             // 123

P.S. Точнее необходимо резервировать место так, чтобы "влазил" фактический параметр, т.е.
в данном случае было достаточно strValue.reserve(5);
При strValue.reserve(4); вернулось бы "tes".
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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