Название: Postgre+Qt Отправлено: bez_glaz от Сентябрь 14, 2011, 15:38 Здравствуйте, я новичёк в освоении qt postgre и linux в том числе =)
Вобщем проблема заключается в следующем: юзаю pgAdmin, с помощью него создаю элементарную базу с 1 таблицей в которой 1 поле (ессесно без ключей всяких и тд и тп), права ставлю паблик и всё по максимум в самом приложении коннект к базе осуществляется корректно но вот на элементарный запрос if (query.exec("SELECT asd FROM qwer")) w.ui->label->setText("net"); w.ui->label_2->setText(query.lastError().text()); выдаёт в label_2 ERROR: relation "qwer" does not exist, ну и соответственно label остаётся неизменным. Уже 2 дня ломаю голову почему так?! Вроде как понял что-то с БД, то ли что-то в опциях не указал то-ли ещё что-то. Заранее спасибо! Название: Re: Postgre+Qt Отправлено: Пантер от Сентябрь 14, 2011, 15:41 Покажи как коннектишься к БД.
Название: Re: Postgre+Qt Отправлено: bez_glaz от Сентябрь 14, 2011, 15:50 #define DEFAULT_DB_HOSTNAME "localhost"
#define DEFAULT_DB_NAME "ras4et" #define DEFAULT_DB_USERNAME "postgres" #define DEFAULT_DB_PASSWORD "postgres" QSettings settings; // Считываем настройки QString HostName = settings.value("HostName", DEFAULT_DB_HOSTNAME).toString(); QString DatabaseName = settings.value("DatabaseName", DEFAULT_DB_NAME).toString(); QString UserName = settings.value("UserName", DEFAULT_DB_USERNAME).toString(); QString Password = settings.value("Password", DEFAULT_DB_PASSWORD).toString(); // Записываем настройки settings.setValue("HostName",HostName); settings.setValue("DatabaseName",DatabaseName); settings.setValue("UserName",UserName); settings.setValue("Password",Password); // подключаемся к БД db.setHostName(HostName); db.setDatabaseName(DatabaseName); db.setUserName(UserName); db.setPassword(Password); первоночально коннектился просто db.setHostName("localhost"); db.setDatabaseName("ras4et"); db.setUserName("postgres"); db.setPassword("postgres"); оба варианта дали положительный результат при проверки: bool ok=db.open(); w.ui->label->setText("111") if (ok) w.ui->label->setText("123") ;else w.ui->label->setText("321"); Название: Re: Postgre+Qt Отправлено: Fess от Сентябрь 14, 2011, 16:07 через pgAdmin запросы работают без проблем?
Название: Re: Postgre+Qt Отправлено: cya-st от Сентябрь 14, 2011, 18:28 я бы еще порт указал:
Код: db.setPort(Port); Название: Re: Postgre+Qt Отправлено: Rem Norton от Сентябрь 14, 2011, 20:49 Есть такой косячок с PostgreSQL. Просто укажите в запросе схему, в которой создана таблица. Рискну предположить, что это схема "public", тогда правильный запрос будет выглядеть так:
Код: SELECT asd FROM public.qwer Название: Re: Postgre+Qt Отправлено: bez_glaz от Сентябрь 15, 2011, 09:26 Значит так:
Во-первых добавление порта ничего не изменило, т.к. сказал уже что коннектится база без проблем; Во-вторых попробывал в pgAdmin запросы потестить и увидел интересную штуку, после того как воспользовался функцией "графический запрос", запрос на языке sql программа составила сама автоматически и выборка выглядела следущем образом - Код: SELECT qwer.asd FROM public.qwer; Попробовал заполнить поля и сохранил результат запроса из pgAdmin в файл - запрос дал положительный результат, т.е. в файле оказались все верные данные. Какие ещё сть размшление что может быть ? Название: Re: Postgre+Qt Отправлено: bez_glaz от Сентябрь 15, 2011, 09:44 полностью зашёл в тупик в редакторе SQL запросов попробовал прописать
Код: SELECT asd FROM qwer; Название: Re: Postgre+Qt Отправлено: Disaron от Сентябрь 15, 2011, 10:52 1. Тебе бы про SQL прочесть;
2. Где QSqlDatabase? Со всеми необходимыми сведениями. Название: Re: Postgre+Qt Отправлено: Пантер от Сентябрь 15, 2011, 10:54 Покажи, как определяешь db.
Название: Re: Postgre+Qt Отправлено: bez_glaz от Сентябрь 15, 2011, 10:58 1. Тебе бы про SQL прочесть; 2. Где QSqlDatabase? Со всеми необходимыми сведениями. Сильно вникать в SQL мне нет нужды моя непосредственная сфера деятельности этого не включает Код: QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); Ещё раз повторяю коннект идёт корректрый, я всё 100 раз тестил пробовал другие данные порты и драйвера, сразу же на них ругался, так что можно сделать логический вывод, что проблема возникает уже после коннекта, хотя хз... Название: Re: Postgre+Qt Отправлено: bez_glaz от Сентябрь 15, 2011, 11:00 Покажи, как определяешь db. Как я понял это ?Код: QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); Название: Re: Postgre+Qt Отправлено: Пантер от Сентябрь 15, 2011, 11:01 Вроде, все нормально. Просто за всю мою работу с постгресом я с такими проблемами не сталкивался.
Название: Re: Postgre+Qt Отправлено: bez_glaz от Сентябрь 15, 2011, 12:43 Вроде, все нормально. Просто за всю мою работу с постгресом я с такими проблемами не сталкивался. Я как бы то же не новичёк в программировании, хоть и опыт мал, но с БД имел дело и с ЯВУ тоже работал, по идеи то же всё верно делаю, но факт остаётся фактом не хочет и всё, пишит что не создана такая таблица и вот ты хоть провались.Я уже 4-ый день читаю по Qt книжку и параллельно синтаксис и документацию к Postgre и не нахожу решение своей прблемы! Название: Re: Postgre+Qt Отправлено: Пантер от Сентябрь 15, 2011, 12:46 А вообще какие-нибудь другие sql запросы отрабатываются? Допустим, создание таблицы или селекты из системных таблиц?
Название: Re: Postgre+Qt Отправлено: bez_glaz от Сентябрь 15, 2011, 13:28 ура! 3 раза =)))
Вернулся к первоначальному способу "коннекта" Код: db.setHostName("localhost"); Скорее всего что-то не так было вот с этими параметрами Код: #define DEFAULT_DB_HOSTNAME "localhost" Теперь сразу же следущий вопрос который у меня возник. При обработки Код: while (query.next()) Цитировать Если вызвать метод QSqlQuery::next() один раз, то он переместит указатель к первой записи. После этого необходимо повторять вызов next(), чтобы получать доступ к другим записям, до тех пор пока он не вернет false. Название: Re: Postgre+Qt Отправлено: andrew.k от Сентябрь 15, 2011, 13:44 почему то выдаёт сначала последнее значение в таблицы, потом переводит указатель на 1-ый элемент и тд проходит по всем элементами, до предпоследнего, затем цикл оканчивается, а должно быт как-то так: Цитировать Если вызвать метод QSqlQuery::next() один раз, то он переместит указатель к первой записи. После этого необходимо повторять вызов next(), чтобы получать доступ к другим записям, до тех пор пока он не вернет false. в запросе добавь order by что-нибудь. Потому без сортировки запрос выводит данные в том порядке в каком они хранятся в БД. А если они у тебя меняются, то и порядок их нарушается. Последний измененный идет в конец или в начало не помню. Название: Re: Postgre+Qt Отправлено: bez_glaz от Сентябрь 15, 2011, 14:01 Спасибо всем разобрался сам =)
Ничего не надо всё и так идеально выводится без лишних зарезервированных операндов SQL, просто почему то в postgre данные визуально (даже если просто просматриваешь записи в таблице) сортируются по возрастанию(не заметил сразу когда вносил через pgAdmin даные), хотя в таблице хранятся по мере добавления. При запросе из приложения берутся данные так, как они хранятся изначально. |