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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: out-параметр из oracle  (Прочитано 7972 раз)
romanick
Гость
« : Июнь 23, 2010, 20:41 »

Привет. Qt 4.6.2, MinGW, Oracle 10g.
Не могу понять почему натыкаюсь на сообщение
"ORA-03106: фатальная ошибка двухзадачного коммуникационного протокола"
 в следующем коде:

Код:
bool DataDisp::test()
{
    if (!db.open())
    {
        DebugLog::debugWr("test-open:" + db.lastError().text());
        return false;
    }
    db.transaction();
    QString res;
    try{
        QSqlQuery q;
        if(!q.prepare("begin ? := 'test'; end;"))
        {
            DebugLog::debugWr("test-prepare:" + q.lastError().text());
            db.close();
            return false;
        }
        QVariant rr(QVariant::String);
        //QVariant rr(" ");

        q.bindValue(0, rr, QSql::Out);
        if (!q.exec())
        {
            DebugLog::debugWr("test-exec:" + q.lastError().text());
            db.rollback();
            db.close();
            return false;
        }
        res = q.boundValue(0).value<QString>();
        db.commit();
        db.close();
    }catch(...)
    {
        db.rollback();
        db.close();
        throw;
    }
}

Если вместо QVariant rr(QVariant::String); использовать QVariant rr(" "); то ошибка пропадает, но при этом q.boundValue(0) возвращает не строку 'test', а только её часть - столько первых символов, сколько было пробелов в QVariant rr(" ");.
Понимаю, что можно сделать QString rr(1024, " "); но это, как бы так сказать, не эротично. Улыбающийся
В чём причина такого странного поведения?
Записан
ритт
Гость
« Ответ #1 : Июнь 23, 2010, 20:46 »

а слабо просто `QVariant rr;` ?
Записан
romanick
Гость
« Ответ #2 : Июнь 25, 2010, 20:25 »

Пробовал и так. Ошибка ora-03106. Т.е. аналогично QVariant rr(QVariant::String);
Записан
ритт
Гость
« Ответ #3 : Июнь 26, 2010, 11:42 »

-q.bindValue(0, rr, QSql::Out);
+q.addBindValue(0, QSql::Out);
Записан
romanick
Гость
« Ответ #4 : Июнь 27, 2010, 12:21 »

-q.bindValue(0, rr, QSql::Out);
+q.addBindValue(0, QSql::Out);
ORA-06502: PL/SQL: : ошибка преобразования символа в число ошибка числа или значения

Пробовал и так:
q.addBindValue("", QSql::Out);
ORA-06502: PL/SQL: : буфер символьных строк слишком маленький ошибка числа или значения

Похоже, это всё же глюк в реализации QOCI.  Его можно обойти способом описанным мною выше, но всё равно неприятно...
Записан
ритт
Гость
« Ответ #5 : Июнь 27, 2010, 13:04 »

нет подобной ошибки в реализации. в текущем проекте используется QOCI и множество подобных кусков кода - всё работает и не жужжит.
а что за `q.addBindValue("", QSql::Out);` такое вообще? это с потолка или методом тыка? не проще ли почитать документацию?
Записан
MoPDoBoPoT
Гость
« Ответ #6 : Июнь 27, 2010, 20:04 »

По-моему я что-то подобное в багтрекере видел.
а что за `q.addBindValue("", QSql::Out);` такое вообще?
Так строковой же тип.
Записан
ритт
Гость
« Ответ #7 : Июнь 27, 2010, 22:15 »

MoPDoBoPoT, ткни носом в таску...

romanick, попробуй то же самое с числами и/или блобами. сейчас бегло глянул - кажись, у нас строки в хп не используются (но не уверен)...
Записан
romanick
Гость
« Ответ #8 : Июнь 28, 2010, 08:29 »

Так как написано в документации не работает. Я об этом в первом посте писал. Читайте внимательнее обсуждение вопроса, а не умничайте. Вопрос - почему не работает.
А код q.addBindValue("", QSql::Out); от безасходности...
Записан
romanick
Гость
« Ответ #9 : Июнь 28, 2010, 08:50 »

Цитировать
romanick, попробуй то же самое с числами и/или блобами
С числами всё прекрасно работало, пока не понадобилось сделать строковой out-параметр.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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