[Qt]syntaxe update

kamy86
[Qt]syntaxe update

salut,
je veux realiser un update dans ma base de données, mais comme je debute en bdd et que je sais pas comment faire avec Qt j'ai essayé ce truc, mais aucun changement dans ma base:

#include "FModifc.h"

FModifc::FModifc()
{

    setFixedSize(350, 300);

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


    valider = new QPushButton("&Valider", this);


    QFormLayout *defLayout = new QFormLayout;
    defLayout->addRow("&Numéro du client à modifier:", id);
    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);


    QGroupBox *groupDefinition = new QGroupBox("Modifier les informations d'un client");
    groupDefinition->setLayout(defLayout);
    groupDefinition->setGeometry(30, 20, 150, 10);

     QVBoxLayout *boutonsLayout = new QVBoxLayout;

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


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

    }


void FModifc::opmodifc()
{    QSqlQuery query;

    query.prepare("UPDATE Client SET Nom=? , Prenom=? ,  Adresse=? , NumTel=? , Email=? , WHERE idc = ?");

    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.addBindValue( id->text().toInt());
    query.exec();
    }

arnaud_dupuis

Bonjour,
Je suis très très très loin d'être un expert en base de donnée mais selon moi le problème viens du code :

void FModifc::opmodifc()
{    QSqlQuery query;

    query.prepare("UPDATE Client SET Nom=? , Prenom=? ,  Adresse=? , NumTel=? , Email=? , WHERE idc = ?");

    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.addBindValue( id->text().toInt());
    query.exec();
    } 

Vous semblez faire un mélange entre plusieurs syntaxes de QSqlQuery.
Dans la doc suivante : http://doc.trolltech.com/4.4/qsqlquery.html
On trouve les exemples suivants :

     QSqlQuery query;
     query.prepare("INSERT INTO person (id, forename, surname) "
                   "VALUES (:id, :forename, :surname)");
     query.bindValue(":id", 1001);
     query.bindValue(":forename", "Bart");
     query.bindValue(":surname", "Simpson");
     query.exec();

Je pense que dans le cas de cette syntaxe la valeur liée avec bindValue() doit être décalré dans la requête. Dans votre cas vous essayez de lier une valeur à un placeholder inexistant.

Avez vous essayer d'appliquer cette syntaxe :

     QSqlQuery query;
     query.prepare("INSERT INTO person (id, forename, surname) "
                   "VALUES (?, ?, ?)");
     query.bindValue(0, 1001);
     query.bindValue(1, "Bart");
     query.bindValue(2, "Simpson");
     query.exec();

Et votre code deviendrai :

void FModifc::opmodifc()
{    QSqlQuery query;

    query.prepare("UPDATE Client SET Nom=? , Prenom=? ,  Adresse=? , NumTel=? , Email=? , WHERE idc = ?");

    query.bindValue(0, nom->text());
    query.bindValue(1, prenom->text());
    query.bindValue(2, adresse->text());
    query.bindValue(3,telephone->text().toInt() );
    query.bindValue(4,email->text());
    query.bindValue(5, id->text().toInt());
    query.exec();
    } 

Si vous n'avez pas tester cela, peut être devriez vous l'essayer.
De plus j'attire votre attention sur l'avertissement suivant de la documentation :

Quote:
Warning: You must load the SQL driver and open the connection before a QSqlQuery is created. Also, the connection must remain open while the query exists; otherwise, the behavior of QSqlQuery is undefined.

Avez vous vérifié que la connexion à la base de donnée est toujours vivante avant de lancer votre tentative de mise à jour ?

Arnaud Dupuis