Strona 1 z 1

[QT]Błąd połączenia z bazą SQL

: 25 wrz 2010, 12:35
autor: Atom
W moim programie jest wymagana baza danych zazwyczaj robiłem ją na strukturze lecz tym razem musi ona być złożona dlatego wybór padł na SQL. Już podczas połączenia z bazą danych wystąpił problem. Wykonuje zgodnie z tym jak jest w tutorialu z QT.
Dodałem dodatkowy wpis do pliku .pro jak wyczytałem z tutoriala.

Kod: Zaznacz cały

QT       += core gui
         += sql
I następnie przystąpiłem do wykonywania połączenia. Lecz już przy pierwszej linii kodu:

Kod: Zaznacz cały

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
dostaje takie oto błedy:

Kod: Zaznacz cały

 error: undefined reference to `QSqlDatabase::defaultConnection'
error: undefined reference to `QSqlDatabase::addDatabase(QString const&, QString const&)'
error: undefined reference to `QSqlDatabase::~QSqlDatabase()'
error: undefined reference to `QSqlDatabase::~QSqlDatabase()'
error: undefined reference to `QSqlDatabase::~QSqlDatabase()'
error: collect2: ld returned 1 exit status
Co robię źle że nawet przykładowe zadania z wielu tutoriali przynoszą takie same błędy ?

Odp: [QT]Problem z bazą danych SQL

: 25 wrz 2010, 13:03
autor: kabanek
nie wiem czy to może być błąd, czy nie, ale spróbuj może tak

Kod: Zaznacz cały

QT       += core gui sql
bo ten błąd oznacza, że nie została zlinkowana biblioteka sql

Odp: [QT]Błąd połączenia z bazą SQL

: 25 wrz 2010, 14:13
autor: Atom
Niestety kabanek poprawienie tego wpisu nie ma żadnego efektu. Nadal dostaje te same błędy. Dodam jeszcze biblioteki które dołączyłem do projektu może nie odpowiednie implementuje:

Kod: Zaznacz cały

#include <QtSql/QSqlDatabase>
#include <QtSql/qsql_sqlite.h>

Odp: [QT]Błąd połączenia z bazą SQL

: 25 wrz 2010, 15:27
autor: kabanek
1. to spróbuj bez przedrostka QtSql/, czyli np

Kod: Zaznacz cały

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
itp

2. a działa Ci przykład do Qt?

Odp: [QT]Błąd połączenia z bazą SQL

: 25 wrz 2010, 20:06
autor: mikolajs
Ten błąd to błąd linkera, więc nie widzi biblioteki a nie plików nagłówkowych.

Kod: Zaznacz cały

QT       += core gui 
ten wpis jest zbędny core i gui będą użyte automatycznie bez tego. Ogranicz się do QT += sql
Możesz też otworzyć Makefile i zobaczyć czy w zmiennej LIBS jest dodana biblioteka QtSql

Odp: [QT]Błąd połączenia z bazą SQL

: 26 wrz 2010, 15:13
autor: Atom
kabanek jednak miałeś racje. Instynktownie dałem średnik na końcu linii. Wszystko ładnie teraz ruszyło :) lecz przy zamykaniu całkowicie programu dostaje taki błąd :

Kod: Zaznacz cały

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
Program nieoczekiwanie przerwał pracę.
W czym jest problem ?

Odp: [QT]Błąd połączenia z bazą SQL

: 26 wrz 2010, 15:46
autor: kabanek
widocznie przed zamknięciem programu nie zakończyłeś połączenia z bazą
connection 'qt_sql_default_connection' is still in use
na to wskazuje

Odp: [QT]Błąd połączenia z bazą SQL

: 26 wrz 2010, 17:22
autor: Atom
Właśnie zakończyłem komendą db.close();

Odp: [QT]Błąd połączenia z bazą SQL

: 26 wrz 2010, 21:23
autor: kabanek
hmm... to może jakieś zapytanie się wtedy wykonuje.

No nie wiem... może pokaż trochę kodu

Odp: [QT]Błąd połączenia z bazą SQL

: 27 wrz 2010, 18:26
autor: mikolajs
Zamknięcie bazy musi odbyć się w innym zasięgu niż tam gdzie są zapytania. I usuwaj bazę metodą statyczną removeDatabase, Samo close zamknie tylko konkretny alias do bazy (połączenia z bazą są statyczne) i powiązane zasoby. Zazwyczaj robię tak, że w konstruktorze tworzę bazę, a w destruktorze usuwam. Zobacz: http://doc.trolltech.com/4.7/qsqldataba ... veDatabase

Odp: [QT]Błąd połączenia z bazą SQL

: 30 wrz 2010, 14:20
autor: Atom
mikolajs sposób zadziałał :) dziękuję bardzo. Lecz teraz może się to wydać śmieszne leszcz mam problem z wpisaniem pozycji do bazy danych a raczej informacji które wpisuje do lineedit. Jeżeli wykonuje na sztywno zapytanie SQL ładnie wszyto się spisuje. W php w zapytaniu wystarczy dać $zmienna a jak jest w QT ? Jak wpisywać do bazy danych informację np. z linednit ?

Odp: [QT]Błąd połączenia z bazą SQL

: 30 wrz 2010, 15:01
autor: kabanek
nie, ale możesz przecież zrobić coś w stylu:
"zapytanie " + ui->lineedit.text() + " dalsza część zapytania";

poszukaj w pomocy do Qt, chyba widziałem tam ładniejsze rozwiązanie tego problemu

Odp: [QT]Błąd połączenia z bazą SQL

: 01 paź 2010, 19:47
autor: mikolajs
Tak jest ładniejsze rozwiązanie :)
metody

Kod: Zaznacz cały

QSqlQuery::prepare  
i potem

Kod: Zaznacz cały

bindValue
Zobacz w dokumentacji.