[Qt]liaison avec la base de données

kamy86
[Qt]liaison avec la base de données

Salut tout le monde,
voilà ça fait un baille que je cherche comment établir une liaison en local avec ma base de données.
j'ai une interface faite avec Qt et une base de données en Access, et je veux utiliser l'API ODBC.
Qu'est ce que je dois faire au juste?j'ai essayé plein de truc mais ça n'a pas marché :cry: , maintenant je veux commencer tout à partir de zéro et j'espère bien parvenir à tout terminer dans les temps parce que c'est un travail à rendre pour ce lundi et dont je doit rédiger le rapport.
voilà mo, main si ça peut vous eclaircir

#include <QApplication>
#include "FPrincipale.h"
#include <QSqlDatabase>


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

   FPrincipale fenetre;
    fenetre.show();

     QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
     db.setHostName("localhost");
     db.setDatabaseName("monprojet");
     db.setUserName("");
     db.setPassword("");
     bool ok = db.open();
    if (!ok) {

        QMessageBox::critical(0, qApp->tr("Cannot open database"),
            qApp->tr("Unable to establish a database connection.n"
                     "This example needs SQLite support. Please read "
                     "the Qt SQL driver documentation for information how "
                     "to build it.nn"
                     "Click Cancel to exit."), QMessageBox::Cancel,
                     QMessageBox::NoButton);
        return false;
}

QObject::connect( qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()) );


    return app.exec();

}

Q:est ce que je dois configurer l'ODBC ou Qt se charge de tout? [/code]

Niroken

Hello,

Ben en faite, une base acccess est contenu dans un fichier .mdb.
Si tu ne configures pas une connexion ODBC pour indiquer le chemin de ta base access via le menu sources de données ODBC de l'outil d'administration, il n'y aucune chance que ton programme le trouve tout seul.

Ensuite si ton soucis vient du fait que tu ne sais pas si tu as configuré correctement ta connexion ODBC ou s'il manque qq chose à ton code, tu peux te connecter à ta base access en odbc avec une autre appli, en access par ex.

Tu auras ainsi éliminé une possibilité.

Bonne chance,
Niroken

K-lo

En premier as-tu vérifié si t'as compilé qt avec le driver correspondant à odbc (pour obtenir le fichier qsqlodbc.dll)
Ensuite dans le fichier ton_projet.pro :
as-tu rajouté la ligne suivante : QT += sql

Que t'es bien le driver dans le répertoire :
dossier_de_l'exe/qslqdrivers/qsqlodbc.dll (valable pour un déploiement de ton application)

Pour le conseil de Niroken je me permet de détailler :

Créer ta source de donnée avec C:/Windows/system32/odcbcad32.exe
et le nom de cette source tu le place en argument de la méthode setDatabaseName("nom_de_la_source");

Tu nous donnerais les erreurs retourné par ton application ça serait également plus facile pour nous de t'aider ;)

kamy86

merci pour votre aide, j'ai reussi à etablir la liaison avec ma base , c'etait une erreur de parametrage dans le code et on plus dans la configuration de l'ODBC au lieu d'utiliser sources de données système j'ai utiliser user.

kamy86

mais voilà qu'un autre problème se presente, je veux faire un ajout dans ma base de données, le code est correct à la compil mais aucun dans la base, en effet j'ai fait des QLineEdit et je veux recuperer leurs valeurs, voilà comment j'ai procedé:

#include "FAjoutc.h"

FAjoutc::FAjoutc()
{
     setFixedSize(300, 250);


    nom = new QLineEdit();
    prenom = new QLineEdit();
    adresse = new QLineEdit();
    telephone = new QLineEdit();
    email = new QLineEdit();


    QFormLayout *defLayout = new QFormLayout;
    defLayout->addRow("&Nom :", nom);
    defLayout->addRow("&Prénom :", prenom);
    defLayout->addRow("&Adresse :", adresse);
    defLayout->addRow("&Numéro de téléphone :", telephone);
    defLayout->addRow("e_mail : ",email);
    valider = new QPushButton("&Valider", this);

    QGroupBox *groupDefinition = new QGroupBox("Ajout d'un client");
    groupDefinition->setLayout(defLayout);
    groupDefinition->setGeometry(30, 20, 150, 50);

        QVBoxLayout *boutonsLayout = new QVBoxLayout;

    boutonsLayout->addWidget(groupDefinition);
    boutonsLayout->addWidget(valider);
    setLayout(boutonsLayout);


    QObject::connect( valider, SIGNAL(clicked()), this, SLOT(opajout()) );
     connect(valider, SIGNAL(clicked()), this, SLOT(close()));


    }

 void FAjoutc::opajout()
{
     QMessageBox::information(this, "Titre de la fenêtre", "Houra ça marche !");

    QSqlQuery query;
    query.prepare("INSERT INTO Client (Nom, Prenom, Adresse, Num Tel, Email)"
    "VALUES (:Nom, :Prenom, :Adresse, :Num Tel, Email)");
    query.bindValue(":Nom", nom);
    query.bindValue(":Prenom", prenom);
    query.bindValue(":Adresse", adresse);
    query.bindValue(":Num Tel",telephone );
    query.bindValue(":Email",email);
    query.exec();



    }

si il y a des changements que je dois faire dites le moi.merci
fredericmazue

Quote:
je veux faire un ajout dans ma base de données, le code est correct à la compil mais aucun dans la base

Je n'ai pas lu attententivement la question (manque de temps :oops:)
Mais quand je lis ta phrase, je me demande si tu n'as pas affaire au gag classique: la base de données n'est peut être pas en mode AUTO COMMIT

kamy86

merci ce problème est reglé mais je rencontre un autre,j'ai fait la connexion avec ma base dans mon main, et maintenant j'essai de faire les requêtes, mais aucun changement dans ma base.Dans la base de données j'ai mis le numéro de client comme clé primaire et elle s'incrémente automatiquemnt mais je sais pas comment faire avec le code je crois que c'est à cause de ça que ça ne marche pas, je veux que ça s'affiche dans la fenêtre de l'ajout sans que l'utilisateur n'y touche.
comment je fais?

fredericmazue

Elle n'est pas très claire ta question...

Quote:
j'essai de faire les requêtes, mais aucun changement dans ma base

As tu vérifié, comme je te l'ai suggéré, que ta base de données est bien en mode AUTCOMMIT ?
Si non, soit tu la mets dans ce mode, soit tu fait des requêtes dans une transaction.

Quote:
elle s'incrémente automatiquemnt mais je sais pas comment faire avec le code

Il n'y a rien à faire dans le cdoe, puisque c'est automatique justement. C'est la base de données qui va réaliser l'incrémentation.

Quote:
je crois que c'est à cause de ça que ça ne marche pas

Ca n'a aucun rapport je pense.

Quote:
je veux que ça s'affiche dans la fenêtre de l'ajout sans que l'utilisateur n'y touche.

Quel rapport avec le reste de la question ?

kamy86
recuperer un entier d'un QLineEdit

salut,
jvoulais savoir comment faire pour recuperer la valeur d'un QLineEdit pour le texte j'ai fait leqlineedit->text() mais pour un entier je sait pas comment faire.
:roll:

K-lo

La méthode QLineEdit::text() retourne un QString
et dans la classe QString il existe la méthode
int toInt ( bool * ok = 0, int base = 10 ) const

leqlineedit->text().toInt();

kamy86
[Qt]recuperer les données d'un SELECT

salut,
je veux faire un select dans ma base de données mais je sait pas comment faire pour recuperer les données et les afficher sur ecran.
SVP comment je fais?
voilà le code de l'ajout d'un client que je veux afficher les informations à la demande de l'utilisateur de mon application de gestion:

#include "FAjoutc.h"

FAjoutc::FAjoutc()
{
     setFixedSize(300, 250);


    nom = new QLineEdit();
    prenom = new QLineEdit();
    adresse = new QLineEdit();
    telephone = new QLineEdit();
    email = new QLineEdit();


    QFormLayout *defLayout = new QFormLayout;
    defLayout->addRow("&Nom :", nom);
    defLayout->addRow("&Prénom :", prenom);
    defLayout->addRow("&Adresse :", adresse);
    defLayout->addRow("&Numéro de téléphone :", telephone);
    defLayout->addRow("e_mail : ",email);
    valider = new QPushButton("&Valider", this);

    QGroupBox *groupDefinition = new QGroupBox("Ajout d'un client");
    groupDefinition->setLayout(defLayout);
    groupDefinition->setGeometry(30, 20, 150, 50);

        QVBoxLayout *boutonsLayout = new QVBoxLayout;

    boutonsLayout->addWidget(groupDefinition);
    boutonsLayout->addWidget(valider);
    setLayout(boutonsLayout);


    connect( valider, SIGNAL(clicked()), this, SLOT(opajoutc()) );
    connect(valider, SIGNAL(clicked()), this, SLOT(close()));


    }

 void FAjoutc::opajoutc()
{    QSqlQuery query;

    query.prepare("INSERT INTO Client (Nom, Prenom, Adresse, NumTel, Email)"
    "VALUES (:Nom, :Prenom, :Adresse, :NumTel, :Email)");
    query.bindValue(":Nom", nom->text());
    query.bindValue(":Prenom", prenom->text());
    query.bindValue(":Adresse", adresse->text());
    query.bindValue(":NumTel",telephone->text().toInt() );
    query.bindValue(":Email",email->text());
    query.exec();

    }
spider_tun
Re: [Qt]liaison avec la base de données

salut kamy86
j'ai vraiment besoin de votre aide sur Qt !! je débute sur Qt et j'ai plein de probleme, et je pense que vous avez le meme sujet que moi!
vous pouvez m'aidez svp!!

K-lo
Re: [Qt]liaison avec la base de données

Pour répondre à kamy86 et sans doute aussi à spider_tun
Pour récupérer les valeurs d'un select :

//Se connecter à la source de données puis :

QSqlQuery *querySelect = new QSqlQuery ;
querySelect->prepare("INSERT INTO Client (Nom, Prenom, Adresse, NumTel, Email)"
    "VALUES (:Nom, :Prenom, :Adresse, :NumTel, :Email)");
querySelect->bindValue(":Nom", nom->text());
querySelect->bindValue(":Prenom", prenom->text());
querySelect->bindValue(":Adresse", adresse->text());
querySelect->bindValue(":NumTel",telephone->text().toInt() );
querySelect->bindValue(":Email",email->text());

if(!querySelect->exec())
{
    qDebug( QString("Erreur SELECT ")+ querySelect->lastError().text() + QString("\n") ); 
    return -1;
}
//Accès aux données :
while(!querySelect->next())
{
    querySelect->value(numero de la colonne).toInt();
    // ou 
    querySelect->value(numero de la colonne).toString();
    //ou autre, selon le type de donnée
}