QT 3.1.1 DB Anbindung - Win - Fehler



  • Hallo, ich weiss unter Windows zu proggen ist armsehling und passt hier nicht so rein, aber ich muss ja irgendwo Posten 😉 ... ich habe win2k & vc++ & QT 3.1.1
    Wir wollen bei unserem Projekt eine Datenbank einbinden und dachten so an was einfaches wie Acsess oder SQL Server 2000. Nun haben wir im QT Designer alles wunder schön hergrichtet die DB eingebaut und im Preview funkt auch alles (!), nur wenn wir das dann standart mässig speichern und im VC++ kompelieren passiert etwas unerwartetes:

    Es geht net 😞

    VC++ gibt eine Fehlermeldung aus die sinngemäß sagt das er eine DB nicht findet und ein Blick in den Quelltext verrät, das anscheint der QT Designer die erfoderlichen Codes nicht mit überträgt. Es ist kein Stück Quelltext zur DB zufinden, als ob es vergessen wurde.

    Nun haben wir versucht das manuel via Dokumentation hinzubekommen, aber da sind wir an unserer inkompetenz gescheitert.

    Hat jemand eine Idee wir das hinbekommen könnten ?

    Der Standart Quelltext wäre ja dieser, vielleicht kann mir den jemand erklären. Wir wollten das mit ODBC machen. Mit JAVA2 haben wir da gute erfahrungen mit gemacht.

    include <qapplication.h>
    #include <qsqldatabase.h>
    #include "../connection.h"

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

    QSqlDatabase *defaultDB = QSqlDatabase::addDatabase( DB_SALES_DRIVER );
    defaultDB->setDatabaseName( DB_SALES_DBNAME );
    defaultDB->setUserName( DB_SALES_USER );
    defaultDB->setPassword( DB_SALES_PASSWD );
    defaultDB->setHostName( DB_SALES_HOST );

    if ( defaultDB->open() ) {
    // Database successfully opened; we can now issue SQL commands.
    }

    return 0;
    }

    Danke Grüsse Arn



  • keiner mag mich bzw. meine Fragen 😞 *heul*



  • Nun ja zuerst wäre vielleicht noch die Fehlermeldung des VC sinnvoll. Dann interessiert mich noch etwas anderes und zwar die defines für die verschiedenen Parameter. Ich tippe mal darauf das der Treiber QODBC3 du den namen der Datenquelle mit angeben mußt so in etwa:

    QSqlDatabase *defaultDB = QSqlDatabase::addDatabase( "QODBC3", "name der ODBC Datenquelle" );
    

    ich hoffe das klappt ansonsten die Fehlermeldung mit angeben

    Joe



  • Hallo, nun habe ich es aus mit mySQL probiert doch alles wie gehabt: Im Preview funktioniert es, auf die DB kann ich problemlos von überall zugreifen, aus dem Preview, mit Frontends, usw., sie geht also.

    Ich habe für die connection folgende Daten (die sind richtig)

    Name: (defoult) <--- ist ja egal wie das ding heisst, mit was nettem gehts auch net
    Driver: QMYSQL3
    Database Name: arn <- ja so heisst die
    User: root <-- sollte ja immer gehen
    Password: <--- habe keines vergeben
    Hostname: localhost <--- tja wassen sonnst ? mit 127.0.0.1 gehts auch net
    Port: 3306 <--- mit defoult gings auch net

    So ist das, im Preview gehts aber nicht nach dem kompielen mit vc++. Ich habe auch mal das Bsp. aus der Online Doku von QT versucht, doch es gab die selbe Fehlermeldung. Ganz genau lautet die immer so:

    "An error occurred while execing the database"



  • #include <qapplication.h>
    #include <qsqldatabase.h>
    #include <qdatatable.h>
    #include <qsqlcursor.h>
    #include <qmessagebox.h>
    
    /* Modify the following to match your environment */
    #define DRIVER       "QMYSQL3"  /* see the Qt SQL documentation for a list of available drivers */
    #define DATABASE     "arn" /* 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 */
    
    class SimpleCursor : public QSqlCursor
    {
    public:
        SimpleCursor () : QSqlCursor( "simpletable" ) {}
    protected:
        QSqlRecord* primeInsert()
        {
            /* a real-world application would use sequences, or the like */
            QSqlRecord* buf = QSqlCursor::primeInsert();
            QSqlQuery q( "select max(id)+1 from simpletable;" );
            if ( q.next() )
                   buf->setValue( "id", q.value(0) );
            return buf;
        }
    };
    
    int main( int argc, char ** argv )
    {
        QApplication a( argc, argv );
    
        QSqlDatabase * db = QSqlDatabase::addDatabase( DRIVER );
        db->setDatabaseName( DATABASE );
        db->setUserName( USER );
        db->setPassword( PASSWORD );
        db->setHostName( HOST );
    
        if( !db->open() ){
            QMessageBox::information( 0, "Unable to open database",
                                      db->lastError().databaseText() + "\nPlease read the README file in the sqltable directory for more information.");
            return 1;
        }
    
        SimpleCursor cursor;
    
        QDataTable table( &cursor ); /* data table uses our cursor */
        table.addColumn( "name", "Name" );
        table.addColumn( "address", "Address" );
        table.setSorting( TRUE );
    
        a.setMainWidget( &table );
        table.refresh(); /* load data */
        table.show();    /* show widget */
    
        return a.exec();
    }
    

    Das ist Praktisch das Beispiel aus der QT Doku, ich habe es einfach mal komplett übernommen, ich hoffe es ist net zu lang.

    Grüsse Arn



  • Hallo, nun gehts ...

    Folgendes, der QT Desginer stellt die Connection für den Preview her, für nichts anders, er erstellt keine Connection für das gemsamte Projekt.

    Um nun auch ganz normal nach dam compielen connecten zu können muss man besten eine connection.cpp schreiben, in der die nötigen sachen drin stehen. vergleiche:
    http://doc.trolltech.com/3.1/designer-manual-8.html

    und das Bsp.:

    \Qt\3.1.1Evaluation\tools\designer\examples\book

    Unser Denkfehler lag darin das wir dachten was wir im Desginer machen wird immer automatisch an das Projekt übertragen, das ist aber bei der DB Anbing nicht der Fall.

    Ich bin durch ein Zufall darauf gekommen und hoffe die nächsten Probleme die auftreten werden lassen sich schneller lösen :-))



  • kleine Anleitung für eine einfache DB Anbindung mit QT 3.1.1 unter Win mit mySQL:

    > 1. gehe in den Designer und male ein DataTable
    > 2. er fragt dich nach der Connection, fülle sie aus das es passt, folge dem
    > Wizzard und mach alles wie du möchtest.
    > 3. Schau im Preview ob alles geht.
    > 4. Wenn du jetzt nachträglich deine Connection ändern möchtest klicke auf
    > Projekt -> Database connections
    > 5. Speicher dein Projekt

    > Achtung, diese Connection die du erstellt hast gilt nur für das Preview
    > deines Compielers, mehr net !!

    > Jetzt machen wir die eigendliche connection

    > 6. Erstelle eine cpp Datei names: connection.cpp und fülle sie mit diesem
    > Code:

    #include <qsqldatabase.h>
     #include "connection.h"
    
     bool createConnections()
     {
         // create the default database connection
         QSqlDatabase *defaultDB = QSqlDatabase::addDatabase( DB_BOOKS_DRIVER );
         defaultDB->setDatabaseName( DB_BOOKS );
         defaultDB->setUserName( DB_BOOKS_USER );
         defaultDB->setPassword( DB_BOOKS_PASSWD );
         defaultDB->setHostName( DB_BOOKS_HOST );
         if ( ! defaultDB->open() ) { 
         qWarning( "Failed to open books database: " + 
               defaultDB->lastError().driverText() );
         qWarning( defaultDB->lastError().databaseText() );
         return FALSE;
         }
    
         return TRUE;
     }
    

    > (ACHTUNG: *defaultDB heisst das unsere connection default
    > ist! ggf. anpassen)

    > 7. erstelle eine connection.h und fülle sie mit:

    #define DB_BOOKS_DRIVER "QMYSQL3"
     #define DB_BOOKS     "name der DB"
     #define DB_BOOKS_USER     "root"
     #define DB_BOOKS_PASSWD ""
     #define DB_BOOKS_HOST     "localhost" 
    
     bool createConnections();
    

    > 8. Editier die connection.h mit den Richtigen Daten !!
    > 9. inculde in deine main.cpp folgendes:

    #include <qsqldatabase.h>
    #include "connection.h"
    

    > und fühge folgendes hinzu:

    if ( ! createConnections() ) 
         return 1;
    

    > So das wars, eigendlich sollte es jetzt gehen, hf

    > Grüsse Arn *d0c*



  • Das Problem ist nicht, daß sich hier keine auskennt sondern "fast keiner" QT unter Windows verwendet.
    Warum?
    Weil es zu teuer ist.
    Wenn du die Vollversion hast, dann bist du gut dran. Die hat hier fast keiner.



  • ja ist schon klar, wollte das ja nur posten ... habe ja nirgendwo geschrieben das sich hier keiner aus kennt, ganz im gegenteil ...

    Wir haben inner Uni QT 3.1 und zuhause habe ich die QT 3.1.1 Eval unter Windows, freiwillig verwende ich das auch nicht, denn in verbindung mit VC++ 6.0 ist das der letzte Rotz, meine Meinung, es stürzt ständig ab und macht ständig Schrottcode, so das man das ganze Projekt vergessen kann. Aber ich habe ja keine Wahl. Ich könnte ja meine Erfahrungen mal posten, möglicherweise muss auch noch mal einer nach mir damit arbeiten ;-). Wenn ihr allerdings der Meinung seid das wäre zu leihenhaft, dann lass ich es halt.

    Grüsse *d0c*



  • Klar kannst du deine Erfahrungen hier Posten
    Ich habe eigentlich mit der QT 2.3 unter Win gute Erfahrungen.


Anmelden zum Antworten