Russian Qt Forum

Qt => Базы данных => Тема начата: varkon от Июнь 18, 2010, 17:19



Название: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: varkon от Июнь 18, 2010, 17:19
Столкнулся с подобной ошибкой, работая с БД Firebird 2.1.
Перепробовал все варианты - в приложении открыть view не удавалось никак. Несмотря на то, что строка запроса в IBExpert выполнялась без всяких проблем. Так же этот же запрос нормально отрабатывал с QSqlQueryModel.
Насколько лично я понял - проблема была непосредственно в классе QSqlQuery - ему не нравилось имя объекта свыше 16 знаков - по крайней мере, преименование объекта проблему решило. В тоже время я не нашел вроде никаких ограничений в исходниках.  Подскажите, может кто сталкивался.


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: MoPDoBoPoT от Июнь 18, 2010, 18:05
Что-то как-то не очень понятно причем здесь
Перепробовал все варианты - в приложении открыть view не удавалось никак.
если ошибка в QSqlQuery.
Так же этот же запрос нормально отрабатывал с QSqlQueryModel.
То есть в QSqlQuery запрос не проходил, а в QSqlQueryModel нормально отработал? Странно, так как QSqlQueryModel является оберткой над QSqlQuery.
Для пущей ясности нужен код все-таки.


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: varkon от Июнь 19, 2010, 09:53
Что-то как-то не очень понятно причем здесь
Перепробовал все варианты - в приложении открыть view не удавалось никак.
если ошибка в QSqlQuery.
Так же этот же запрос нормально отрабатывал с QSqlQueryModel.
То есть в QSqlQuery запрос не проходил, а в QSqlQueryModel нормально отработал? Странно, так как QSqlQueryModel является оберткой над QSqlQuery.
Для пущей ясности нужен код все-таки.
Еще раз проверил и выяснил - проблема оказалась видимо в моем не понимании разницы методов класса exec() и executeQuery()
Дело в том, что в процессе разработки я использовал такой код:
Код:
QSqlQuery *model = new QSqlQuery(dmModule::db);
    model->prepare("select result from  sprmetrics_modify(:smid,:smname,:smname_short,:smcoef,'','new')");
    model->bindValue(":smid",item.smid);
    ...
    ...
    model->setForwardOnly(true);
    model->exec();
    if(model->lastError().isValid()){
      QMessageBox::about(0,"errror",model->lastError().text()+model->lastQuery());
    }
    while(model->next())
    item.smid =  model->record().value("result").toInt();
   
    delete model;
    return i;
т.е. выполняется некая процедура которая может вернуть 1 значение.
Так вот, получить это значение иначе (выполнив execute procedure) у меня не получалось. Получилось только используя конструкцию select.
Логично, что когда мне понадобилось получить forward-only выборку из вьюхи по определенным параметрам, я использовал подобную же конструкцию. С exec(). Который нормально отрабатывал селект с процедурой. Но как выяснилось  - для вьюх и таблиц надо использовать  executeQuery(). Так что проблема как оказалось даже не в размерах названия. Так случайно попало, что видимо я изменил наименование объекта в базе и обратив внимание на executeQuery() (который как я считал предназначен для запросов-модификаторов - insert/update/delete) решил от отчаяния попробовать его.
Спасибо за внимание. 


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: crossly от Июнь 19, 2010, 10:33
executeQuery() - это метод какого класса... ??


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: varkon от Июнь 19, 2010, 11:01
прошу прощения опечатался  - executedQuery.


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: crossly от Июнь 19, 2010, 11:13
Цитировать
Но как выяснилось  - для вьюх и таблиц надо использовать  executeQuery()
что сие означает??


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: varkon от Июнь 19, 2010, 12:10
Уважаемый, вы то что я написал во втором своем посте прочли?
Что именно вам не понятно? Я не прав в своем выводе? Укажите в чем.
Повторяю еще раз - попытка выполнить заранее подготовленый запрос вида "select * from vwsome" где vwsome  - объект БД Firebird типа view, используя класс QSqlQuery  и его метод exec() - приводит к ошибке, которая указана в заголовке. В то же время запрос вида "select * from some_xp()" (где some_xp()  - хранимая процедура) выполняется нормально.
Решением проблемы явилось вызов вместо метода exec() - executedQuery(). Хотя согласно документации - разница у этих методов только в возвращаемом значении.
В таком случае - почему возникает ошибка?


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: BRE от Июнь 19, 2010, 12:23
Уважаемый, вы то что я написал во втором своем посте прочли?
Что именно вам не понятно? Я не прав в своем выводе? Укажите в чем.
Повторяю еще раз - попытка выполнить заранее подготовленый запрос вида "select * from vwsome" где vwsome  - объект БД Firebird типа view, используя класс QSqlQuery  и его метод exec() - приводит к ошибке, которая указана в заголовке. В то же время запрос вида "select * from some_xp()" (где some_xp()  - хранимая процедура) выполняется нормально.
Решением проблемы явилось вызов вместо метода exec() - executedQuery(). Хотя согласно документации - разница у этих методов только в возвращаемом значении.
В таком случае - почему возникает ошибка?

Вообще то executedQuery ничего не выполняет, он просто возвращает:
Цитировать
the last query that was successfully executed.


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: crossly от Июнь 19, 2010, 13:38
Цитировать
Вообще то executedQuery ничего не выполняет, он просто возвращает:
Цитировать
the last query that was successfully executed.
+100

вообще я посоветовал бы пользоваться  драйвером QIBASE....+ пишите имена объектов(таблиц, вьюх) в верхнем регистре....


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: varkon от Июнь 19, 2010, 14:10
Хм. Действительно. Запрос выполнился просто потому, что уже сформированную строку я передал в конструктор.
Вероятно где то затупил - сейчас нормально выполняется и параметризованный запрос.
Цитировать
вообще я посоветовал бы пользоваться  драйвером QIBASE....+ пишите имена объектов(таблиц, вьюх) в верхнем регистре....
пока с ним проблемы - вроде собрался нормально, но загружаться не хочет. Решать эту проблему буду в последнюю очередь.
По поводу верхнего регистра - это больше актуально для создания объектов в самой БД насколько мне известно. Какое отношение это может иметь к клиенской части? Да и ошибка тогда другая.


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: lit-uriy от Июнь 19, 2010, 15:10
>>но загружаться не хочет
в PATH при запуске приложения, должен быть виден клиент Firebird, т.к. драйвер от него зависит


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: crossly от Июнь 19, 2010, 15:17
Цитировать
По поводу верхнего регистра - это больше актуально для создания объектов в самой БД насколько мне известно. Какое отношение это может иметь к клиенской части? Да и ошибка тогда другая.
у меня были когда то проблемы... не находились объекты если в запросе писал в нижнем регистре.... хотя в isql без проблем в любом....


Название: Re: QSqlQuery - ошибка последовательности функций ODBC3 ...
Отправлено: varkon от Июнь 19, 2010, 16:16
>>но загружаться не хочет
в PATH при запуске приложения, должен быть виден клиент Firebird, т.к. драйвер от него зависит
:) прикольно. Буквально только что прочел рекомендацию (и по моему вашу же) на этом форуме подбросить длл в папку запуска программы. И заработало.
В PATH было добавлено  - и отдельно папку ФБ добавил, и преставил сам сервер, что бы он был в папке без пробелов, и в систем32 запихнул - проблему решило только это.
Спасибо всем за помощь. Тему можно считать закрытой.