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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlQuery - ошибка последовательности функций ODBC3 ...  (Прочитано 10245 раз)
varkon
Гость
« : Июнь 18, 2010, 17:19 »

Столкнулся с подобной ошибкой, работая с БД Firebird 2.1.
Перепробовал все варианты - в приложении открыть view не удавалось никак. Несмотря на то, что строка запроса в IBExpert выполнялась без всяких проблем. Так же этот же запрос нормально отрабатывал с QSqlQueryModel.
Насколько лично я понял - проблема была непосредственно в классе QSqlQuery - ему не нравилось имя объекта свыше 16 знаков - по крайней мере, преименование объекта проблему решило. В тоже время я не нашел вроде никаких ограничений в исходниках.  Подскажите, может кто сталкивался.
Записан
MoPDoBoPoT
Гость
« Ответ #1 : Июнь 18, 2010, 18:05 »

Что-то как-то не очень понятно причем здесь
Перепробовал все варианты - в приложении открыть view не удавалось никак.
если ошибка в QSqlQuery.
Так же этот же запрос нормально отрабатывал с QSqlQueryModel.
То есть в QSqlQuery запрос не проходил, а в QSqlQueryModel нормально отработал? Странно, так как QSqlQueryModel является оберткой над QSqlQuery.
Для пущей ясности нужен код все-таки.
Записан
varkon
Гость
« Ответ #2 : Июнь 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) решил от отчаяния попробовать его.
Спасибо за внимание. 
Записан
crossly
Гость
« Ответ #3 : Июнь 19, 2010, 10:33 »

executeQuery() - это метод какого класса... ??
Записан
varkon
Гость
« Ответ #4 : Июнь 19, 2010, 11:01 »

прошу прощения опечатался  - executedQuery.
Записан
crossly
Гость
« Ответ #5 : Июнь 19, 2010, 11:13 »

Цитировать
Но как выяснилось  - для вьюх и таблиц надо использовать  executeQuery()
что сие означает??
Записан
varkon
Гость
« Ответ #6 : Июнь 19, 2010, 12:10 »

Уважаемый, вы то что я написал во втором своем посте прочли?
Что именно вам не понятно? Я не прав в своем выводе? Укажите в чем.
Повторяю еще раз - попытка выполнить заранее подготовленый запрос вида "select * from vwsome" где vwsome  - объект БД Firebird типа view, используя класс QSqlQuery  и его метод exec() - приводит к ошибке, которая указана в заголовке. В то же время запрос вида "select * from some_xp()" (где some_xp()  - хранимая процедура) выполняется нормально.
Решением проблемы явилось вызов вместо метода exec() - executedQuery(). Хотя согласно документации - разница у этих методов только в возвращаемом значении.
В таком случае - почему возникает ошибка?
Записан
BRE
Гость
« Ответ #7 : Июнь 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.
Записан
crossly
Гость
« Ответ #8 : Июнь 19, 2010, 13:38 »

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

вообще я посоветовал бы пользоваться  драйвером QIBASE....+ пишите имена объектов(таблиц, вьюх) в верхнем регистре....
Записан
varkon
Гость
« Ответ #9 : Июнь 19, 2010, 14:10 »

Хм. Действительно. Запрос выполнился просто потому, что уже сформированную строку я передал в конструктор.
Вероятно где то затупил - сейчас нормально выполняется и параметризованный запрос.
Цитировать
вообще я посоветовал бы пользоваться  драйвером QIBASE....+ пишите имена объектов(таблиц, вьюх) в верхнем регистре....
пока с ним проблемы - вроде собрался нормально, но загружаться не хочет. Решать эту проблему буду в последнюю очередь.
По поводу верхнего регистра - это больше актуально для создания объектов в самой БД насколько мне известно. Какое отношение это может иметь к клиенской части? Да и ошибка тогда другая.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Июнь 19, 2010, 15:10 »

>>но загружаться не хочет
в PATH при запуске приложения, должен быть виден клиент Firebird, т.к. драйвер от него зависит
Записан

Юра.
crossly
Гость
« Ответ #11 : Июнь 19, 2010, 15:17 »

Цитировать
По поводу верхнего регистра - это больше актуально для создания объектов в самой БД насколько мне известно. Какое отношение это может иметь к клиенской части? Да и ошибка тогда другая.
у меня были когда то проблемы... не находились объекты если в запросе писал в нижнем регистре.... хотя в isql без проблем в любом....
Записан
varkon
Гость
« Ответ #12 : Июнь 19, 2010, 16:16 »

>>но загружаться не хочет
в PATH при запуске приложения, должен быть виден клиент Firebird, т.к. драйвер от него зависит
Улыбающийся прикольно. Буквально только что прочел рекомендацию (и по моему вашу же) на этом форуме подбросить длл в папку запуска программы. И заработало.
В PATH было добавлено  - и отдельно папку ФБ добавил, и преставил сам сервер, что бы он был в папке без пробелов, и в систем32 запихнул - проблему решило только это.
Спасибо всем за помощь. Тему можно считать закрытой.
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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