Название: QSqlTableModel и Postgers Отправлено: Keeper13 от Октябрь 30, 2008, 14:11 Доброго времени суток.
(QT 4.4.0) Значит проблема в следующем: Есть база данных на Постгресе, на соседнем компе. Соеденяюсь. 1. Пробую следующее: Код: tbModel = new QSqlQueryModel(this); 2. Дальше пробую: изменяю тип модели на QSqlTableModel: Код: tbModel = new QSqlTableModel(this); 3. Дальше дописываю: Код: QMessageBox::critical(0, tr("Error: Select failure!"), tbModel -> lastError().text()); 4. Пробую через: /demos/sqlbrowser. Подключаюсь, выдает спсиок таблиц. Двойной-клик по doc_t, и в статусбаре: : Unable to find table doc_t Так понимаю, что проблема в том же. То есть QSqlTableModel не видит таблиц, хотя та же QSqlQueryModel эти таблицы видит. Проблема помоему была уже только с Ораклом, но что это за трабл, так никто и не ответил. тут: (http://www.prog.org.ru/topic_7678_0.html) Название: Re: QSqlTableModel и Postgers Отправлено: c00ker от Октябрь 30, 2008, 16:22 попробуй
tbModel -> setTable("DOC_T"); Название: Re: QSqlTableModel и Postgers Отправлено: panAlexey от Октябрь 30, 2008, 17:43 угу..
у постгреса некоторые вещи регистрозависимы.. Название: Re: QSqlTableModel и Postgers Отправлено: Keeper13 от Октябрь 30, 2008, 18:19 Цитировать tbModel -> setTable("DOC_T"); Неа... всё равно.Только теперь: Unable to find table DOC_T Дело не в регистре... Название: Re: QSqlTableModel и Postgers Отправлено: developer от Октябрь 30, 2008, 20:01 Попробуй изменить название таблицы, возможно твое название з чем то конфликтует
Название: Re: QSqlTableModel и Postgers Отправлено: Rcus от Октябрь 30, 2008, 21:46 меня эта тема заинтересовала и я провел небольшое расследование:
первым делом идем в сырцы ..\src\sql\models\qsqltablemodel.cpp : Код: if (d->rec.count() == 0) Идем в ..\src\sql\drivers\psql\qsql_psql.cpp : 950 Код: switch(d->pro) { там же строка 670 Код: d->pro = getPSQLVersion(d->connection); 604 строка и точно, Код: QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version6; Код: 2008-10-30 23:34:05 YEKT STATEMENT: select pg_attribute.attname, int(pg_attribute.atttypid), pg_attribute.attnotnull, pg_attribute.attlen, pg_attribute.atttypmod, int(pg_attribute.attrelid), pg_attribute.attnum from pg_class, pg_attribute where lower(pg_class.relname) = 't_doc' and pg_attribute.attnum > 0 and pg_attribute.attrelid = pg_class.oid //во вставках кода много поскипано, кому надо тот лучше взглянет на оригинал Название: Re: QSqlTableModel и Postgers Отправлено: Rcus от Октябрь 30, 2008, 21:57 для тех кому лень читать приведу фрагмент qsql_psql.cpp из 4.5.0-snapshot
Код: case 8: Название: Re: QSqlTableModel и Postgers Отправлено: Keeper13 от Октябрь 31, 2008, 11:29 Да, спасибо.
Сам нашел, исправил просто в методе: Protocol getPSQLVersion(PGconn* connection) первую строку на: QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version82; То есть по умолчанию беру v.8.2... Перекомпилил - всё работает. Согласен что мой драйвер с 6-кой работать не будет. Но думаю мне и не надо. Залез сюда написать решение, смотрю ты уже всё рассказал (да ищё и правельнее). Будет время, сделаю по человеческому. Rcus - молодец! Название: Re: QSqlTableModel и Postgers Отправлено: grio от Ноябрь 21, 2009, 06:47 у меня была похожая ситуация с базой SQLITE. часов 5 ковырялся.
оказалось в итоге, что просто создавал модель до коннекта с базой. :) br, grio. Название: Re: QSqlTableModel и Postgers Отправлено: PavelVX от Январь 24, 2011, 11:19 Не хотелось бы быть некрофильм, но объясните чайнику, что делать-то в таком случае?
У меня так: server: altlinux + PostgreSQL 8.3.5, client 1. (alt linux + qt 4.7) QSqlRelationalTableModel * albumsRelation = new QSqlRelationalTableModel(0); albumsRelation->setTable("\"Temp\".\"Temp\""); Данный код не работает. Точнее так: при самом первом запуске, когда только установил все, оно запустилось и выдало результат. С тех пор не хочет :( И комп перегружал. Не хочет и все :( qDebug() << albumsRelation->lastError(); говорит следующее: QSqlError(-1, "Unable to find table "Temp"."Temp"", "") Что делать? Оно же показало один раз, что все правильно. Если сделать так: QSqlQueryModel * model = new QSqlQueryModel(); model->setQuery("select * from \"Temp\".\"Temp\""); то все будет работать. Если я правильно понял, то нужно пересобрать драйвер. В qsql_psql.cpp правим: QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version6; заменил на QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version82; Пересобрал по инструкции. Но все равно не работает. :( Как убедиться, что я правильно собрал драйвер? Или в чем еще может быть проблема? |