Russian Qt Forum

Qt => Базы данных => Тема начата: bez_glaz от Сентябрь 14, 2011, 15:38



Название: 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");
    db.setDatabaseName("ras4et");
    db.setUserName("postgres");
    db.setPassword("postgres");
всё заработало )
Скорее всего что-то не так было вот с этими параметрами
Код:
#define DEFAULT_DB_HOSTNAME     "localhost"
#define DEFAULT_DB_NAME         "ras4et"
#define DEFAULT_DB_USERNAME     "postgres"
#define DEFAULT_DB_PASSWORD     "postgres"
и последущей их обработки, потом про этот способ по подробнее почитаю, взял его с примера прошлого проекта, где всё нормально работало.


Теперь сразу же следущий вопрос который у меня возник.

При обработки
Код:
while (query.next())
        name = query.value(0).toInt();
        msgBox.setText(QString::number(name));
        msgBox.exec();
    }
почему то выдаёт сначала последнее значение в таблицы, потом переводит указатель на 1-ый элемент и тд проходит по всем элементами, до предпоследнего, затем цикл оканчивается, а должно быт как-то так:

Цитировать
Если вызвать метод 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 даные), хотя в таблице хранятся по мере добавления. При запросе из приложения берутся данные так, как они хранятся изначально.