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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlTableModel и Postgers  (Прочитано 11244 раз)
Keeper13
Гость
« : Октябрь 30, 2008, 14:11 »

Доброго времени суток.
(QT 4.4.0)
Значит проблема в следующем:
Есть база данных на Постгресе, на соседнем компе. Соеденяюсь.
1. Пробую следующее:
Код:
tbModel = new QSqlQueryModel(this);
tbModel -> setQuery("SELECT * FROM doc_t")
tableView -> setModel(tbModel);
Работает, всё в tableView! То есть всё мы видим, права у юзера на SELECT (и всё остальное) есть.

2. Дальше пробую: изменяю тип модели на QSqlTableModel:
Код:
tbModel = new QSqlTableModel(this);
tbModel -> setTable("doc_t");
tbModel -> setEditStrategy(QSqlTableModel::OnManualSubmit);
tbModel -> select();
tableView -> setModel(tbModel);
Не работает, tableView - ничего не отображает.

3. Дальше дописываю:
Код:
QMessageBox::critical(0, tr("Error: Select failure!"),  tbModel -> lastError().text());
Выдает: Unable to find table doc_t

4. Пробую через: /demos/sqlbrowser.
Подключаюсь, выдает спсиок таблиц.
Двойной-клик по doc_t, и в статусбаре: : Unable to find table doc_t
Так понимаю, что проблема в том же.
То есть QSqlTableModel не видит таблиц, хотя та же QSqlQueryModel эти таблицы видит.
Проблема помоему была уже только с Ораклом, но что это за трабл, так никто и не ответил. тут: (http://www.prog.org.ru/topic_7678_0.html)
Записан
c00ker
Гость
« Ответ #1 : Октябрь 30, 2008, 16:22 »

попробуй
tbModel -> setTable("DOC_T");
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #2 : Октябрь 30, 2008, 17:43 »

угу..
у постгреса некоторые вещи регистрозависимы..
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Keeper13
Гость
« Ответ #3 : Октябрь 30, 2008, 18:19 »

Цитировать
tbModel -> setTable("DOC_T");
Неа... всё равно.
Только теперь:  Unable to find table DOC_T
Дело не в регистре...
Записан
developer
Гость
« Ответ #4 : Октябрь 30, 2008, 20:01 »

Попробуй изменить название таблицы, возможно твое название з чем то конфликтует
Записан
Rcus
Гость
« Ответ #5 : Октябрь 30, 2008, 21:46 »

меня эта тема заинтересовала и я провел небольшое расследование:
первым делом идем в сырцы
..\src\sql\models\qsqltablemodel.cpp :
Код:
    if (d->rec.count() == 0)
        d->error = QSqlError(QLatin1String("Unable to find table ") + d->tableName, QString(),
                             QSqlError::StatementError)
rec это QSqlRecord - описание полей, метод count возвращает количество полей, реализация зависит от драйвера.
Идем в
..\src\sql\drivers\psql\qsql_psql.cpp : 950
Код:
    switch(d->pro) {
    case QPSQLDriver::Version6:
..
    case QPSQLDriver::Version7:
..
и начинаем подозревать неладное (в зависимости от версии меняется текст запроса возвращающего информацию о полях таблицы)
там же строка 670
Код:
        d->pro = getPSQLVersion(d->connection);
чувствую разгадка близко
604 строка и точно,
Код:
    QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version6;
    PGresult* result = PQexec(connection, "select version()");
...
            case 8:
                switch (vMin) {
                case 0:
                    serverVersion = QPSQLDriver::Version8;
                    break;
                case 1:
                    serverVersion = QPSQLDriver::Version81;
                    break;
                case 2:
                    serverVersion = QPSQLDriver::Version82;
                    break;
                }
                break;
            default:
                break;
            }
..
    if (serverVersion < QPSQLDriver::Version73)
        qWarning("This version of PostgreSQL is not supported and may not work.");

дальше чтобы убедиться в гипотезе сверяем версию постгреса (кажется у ОП 8.3 или выше, как и в моем тесте), и лезем в лог, встречаем там интересные строки
Код:
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 
2008-10-30 23:34:05 YEKT ERROR:  syntax error at or near "(" at character 28
Надо бы конечно прогнать это все под отладчиком чтобы быть полностью уверенным, но мне что-то лень
//во вставках кода много поскипано, кому надо тот лучше взглянет на оригинал
« Последнее редактирование: Октябрь 31, 2008, 10:34 от Rcus » Записан
Rcus
Гость
« Ответ #6 : Октябрь 30, 2008, 21:57 »

для тех кому лень читать приведу фрагмент qsql_psql.cpp из 4.5.0-snapshot
Код:
            case 8:
                switch (vMin) {
                case 0:
                    serverVersion = QPSQLDriver::Version8;
                    break;
                case 1:
                    serverVersion = QPSQLDriver::Version81;
                    break;
                case 2:
                default:
                    serverVersion = QPSQLDriver::Version82;
                    break;
                }
Записан
Keeper13
Гость
« Ответ #7 : Октябрь 31, 2008, 11:29 »

Да, спасибо.
Сам нашел, исправил просто в методе:
Protocol getPSQLVersion(PGconn* connection)
первую строку на:
QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version82;
То есть по умолчанию беру v.8.2...
Перекомпилил - всё работает.
Согласен что мой драйвер с 6-кой работать не будет. Но думаю мне и не надо.
Залез сюда написать решение, смотрю ты уже всё рассказал (да ищё и правельнее).
Будет время, сделаю по человеческому.
Rcus - молодец!
Записан
grio
Гость
« Ответ #8 : Ноябрь 21, 2009, 06:47 »

у меня была похожая ситуация с базой SQLITE. часов 5 ковырялся.
оказалось в итоге, что просто создавал модель до коннекта с базой. Улыбающийся

br,
grio.
« Последнее редактирование: Ноябрь 21, 2009, 10:04 от grio » Записан
PavelVX
Гость
« Ответ #9 : Январь 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;
Пересобрал по инструкции. Но все равно не работает. Грустный Как убедиться, что я правильно собрал драйвер? Или в чем еще может быть проблема?
« Последнее редактирование: Январь 25, 2011, 12:26 от PavelVX » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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