Seite 1 von 2

Qt4 und SQL - Abfrageprobleme

Verfasst: 18. Januar 2010 12:00
von tYREL
Hallo zusammen,

wollte mich etwas mit Qt und SQL befassen. Hab dazu folgenden Code aus einem Buch etwas gekürzt.

Code: Alles auswählen

#include <QtGui/QApplication>
#include <QtGui>
#include <QtSql>
#include <QDebug>
#include "sqlexample1.h"


/* Modify the following to match your environment */
#define DRIVER       "QSQLITE"  /* see the Qt SQL documentation for a list of available drivers */
#define DATABASE     "cdcol" /* the name of your database */
#define USER         "root"   /* user name with appropriate rights */
#define PASSWORD     ""   /* password for USER */
#define HOST         "localhost" /* host on which the database is running */


int main(int argc, char* argv[]) {
   QApplication app(argc, argv);

   QSqlDatabase db = QSqlDatabase::addDatabase(DRIVER);
   db.setHostName(HOST);
   db.setDatabaseName(DATABASE);
   db.setUserName(USER);
   db.setPassword(PASSWORD);

   if (!db.open()) {
      QSqlError err =  db.lastError ();
      QMessageBox::information(0, QObject::tr("Fehler"), err.text());
      return 1;
   }
   QTextEdit edit;
   QSqlQuery query;

   // Alle Daten abfragen
   query.exec("SELECT * FROM cds");
   QSqlRecord record = query.record();
   while (query.next()) {
      QString  line =
         query.value(record.indexOf("titel")).toString();
         line.append(QObject::tr(", "));
         edit.append(line);
   }
  edit.show();
  return app.exec();
}
Die Verbindung zur Datenbank klappt wunderbar. Es handelt sich hierbei um die Beispiele aus XAMPP. In der Datentabelle sind 3 Datensätze. QSqlRecord liefert allerdings nichts zurück. Kann mir da jemand helfen?

Danke+Grüße
tYREL

Verfasst: 18. Januar 2010 12:18
von guenni81
Schreib mal dein

Code: Alles auswählen

QSqlRecord record = query.record(); 
in die while schleife.

Verfasst: 18. Januar 2010 12:23
von tYREL
ändert leider nichts. es wird immer noch nichts angezeigt. :?

Verfasst: 18. Januar 2010 12:34
von guenni81
Ja, war auch nicht wirklich verkehrt, sorry mein Fehler.
Prüfe mal ob es das Feld titel in der DB wirklich gibt oder ob dies eventuell anderster lautet. Alternativ würde ich auch einfach mal die Nummer selbst per Hand in der Value Funktion eintragen.

Verfasst: 18. Januar 2010 12:46
von tYREL
feldnamen stimmen, tabellen und datenbanknamen habe ich ebenfalls mehrmals geprüft.

du meinst zum beispiel so:

Code: Alles auswählen

		QString line = query.value(1).toString();
hat auch nicht geholfen :cry:

Verfasst: 18. Januar 2010 12:50
von tYREL
kann es evtl daran liegen:

Code: Alles auswählen

db.setHostName(HOST);
wenn ich nämlich anstelle von "localhost", "" schreibe, dann klappt die verbindung mit open() trotzdem, aber angezeigt wird auch nichts. muß ich da evtl. was anders machen?

Verfasst: 18. Januar 2010 12:51
von guenni81
Wird die richtige DB geöffnet?
Gibt mal den kompletten Pfad + Dateiname zur Datenbank in der Funktion setDatabaseName an. Da es sich hier um eine Sqlite Datenbank handelt spielt der hostname meines wissens keine wirkliche Rolle.

Verfasst: 18. Januar 2010 13:54
von tYREL
Ob die richtige Datenbank geöffnet wird kann ich nicht sagen. Über QSqlDatabase::databaseName bekommt man ja den Namen zurück. Der wäre korrekt.

Das mit dem Pfad und Namen verstehe ich nicht ganz. Soll ich da den Filesystem Pfad eintragen. Wenn ja, dann bekomme ich einen Fehler, dass Qt die Datenbank nicht finden kann.

Verfasst: 18. Januar 2010 13:58
von guenni81
Ja, trag mal den kompletten Pfad zur DB mit ein.
Bspl. c:\irgendwas\datenbank.db
Allerdings bin ich mir nicht ganz sicher ob du bei Windows ein \\ machen mußt.

Verfasst: 18. Januar 2010 15:14
von tYREL
gleiches ergebnis. open() liefert zwar keinen fehler zurück, aber angezeigt wird nix. ich denke, da klappt irgendwas nicht. möglicherweise liegt es auch an meiner xampp installation, die sich nicht verträgt mit der VS SQL Express installtion. Ich versuche mal eher den MS SQL Express Server zu verbinden. Vielleicht klappt ja das. Vielen Dank für Deine Hilfe. :D

Verfasst: 18. Januar 2010 15:20
von guenni81
Kann das sein das du auf die MySQL DB zugreifen willst und die Daten dort vorhanden sind? Für Sqlite brauchst du nämlich keine XAMPP installation. Momentan greifst du ja auf ne Sqlite DB zu.
Jetzt bin ich ein wenig verwirrt.

Verfasst: 18. Januar 2010 15:48
von franzf
QSQLITE erwartet allein ein "setDatabaseName()", welchem du den Dateinamen (!) des db-file gibst. Deine Applikation muss dieses file nur finden.
setHostName usw. sind wirkungs- und nutzlos bei SQLITE, da du da keinen server hast, sondern wie gesagt nur ein db-file.

Ein "define" find ich nicht so gut, da es jedes Vorkommen von "DATABASE" durch "cdcol" ersetzt.
Wenn du das wirklich oben stehen haben willst, ist es besser da nen "static const QString DATABASE("cdcol");" hinzusetzen.

Verfasst: 18. Januar 2010 15:58
von tYREL
ich bin auch schon den ganzen tag verwirrt :D . ich weis nämlich nicht genau was ich tue. ich versuch mal zu erklären was ich tun wollte.

als ich habe auf meinem arbeitsrechner Visual C++ laufen + SQL Server Express. Der Dienst läuft auch.

Dann habe ich in besagtem Buch (wo der Code her ist) gelesen, dass der Author für seine Anwendungen eine XAMPP installation empfiehlt. Also dachte ich mir warum net, installiere ich das halt. Und seither komme ich einfach nicht weiter. Ach ja und das ganze ist virtuallisiert. Sprich die ganze IDE und XAMPP läuft auf VMWare (WinXP SP2).

Ich vermute auch ganz stark, dass hier irgendwo der Fehler liegt. Ich wer heute abend nochmal ein bisschen suchen... :wink:

Verfasst: 18. Januar 2010 16:02
von guenni81
Die Virtualisierung sollte eigentlich nix ausmachen...

Verfasst: 18. Januar 2010 16:12
von franzf
Dein VM wird doch sicherlich eine IP haben, oder? Kannst aus der VM heraus diese auch mit loalhost ansprechen?
XAMPP hat nen MySQL-Server. Für ne reine DB ist XAMPP aber voll oversized, das startet weils wurscht ist gleich noch nen Apache, auf dem ein PHP läuft... Brauchst du doch nicht ;)

Für bissi SQL spielen reicht ein SQLITE vollkommen! Einfach Filename angeben, fertig! Ansonsten bracuhst du eindeutig nen anderen SQL-Driver ;) (QMYSQL oder so) Dann sollte das aber funktionieren!
Wenn dein Buch einen XAMPP empfiehlt muss auch drinnen stehen wie du Qt dazu bewegst sich auf den zu connecten! Ansonsten

Code: Alles auswählen

Buch
     \
      |
      |    /
      |   /
         /
   |     |
   |  T  |
   |  O  |
   |  N  |
   |  N  |
   |  E  |
   |_____|
oder so :P