2010-12-14 44 views
3

Si je fais ceci:QSqlTableModel résultat vide

QSqlQuery searchQuery(QString("select * from people where id = %1").arg(1)); 
if (searchQuery.next()) 
    { 
    std::cout << "Name: " << searchQuery.value(1).toString().toStdString() << std::endl; 
    } 

La sortie est (comme prévu):

Name: David 

Cependant, si je fais ceci:

QSqlTableModel *model = new QSqlTableModel; 
    // Set used table 
    model->setTable("people"); 
    model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
// Set where clause 
model->setFilter(QString("id=%1").arg(1)); 
model->select(); 

// Read result 
QSqlRecord record = model->record(); 
if (!record.isEmpty()) 
    { 
    std::cout << "Name from model: " << record.value(1).toString().toStdString(); 
    } 

L'enregistrement est non vide, mais la sortie est vide:

Name from model: 

Quelqu'un peut-il voir ce que j'ai mal fait en utilisant le QSqlTableModel? De plus, avec les deux méthodes, je ne comprends pas comment vous n'avez pas besoin de dire quelle base de données utiliser (c'est-à-dire que j'instancie une QSqlDatabase et .open(), mais je ne dis jamais à la requête de fonctionner la base de données?)

Merci,

David

Répondre

3
QSqlRecord record = model->record(); 

Vous utilisez QSqlQueryModel::record() qui renvoie un enregistrement "en blanc", au lieu de QSqlQueryModel :: enregistrement (ligne int). L'enregistrement que vous obtenez n'est pas vide: vous pouvez obtenir le numéro et le nom des champs renvoyés par la requête.

Avec QSqlQuery ou QSqlTableModel, vous pouvez spécifier la connexion à la base de données à utiliser (voir les constructeurs QSqlTableModel ou QSqlQuery). Si ce n'est pas le cas, la connexion à la base de données par défaut est utilisée: voir QSqlDatabase documentation. Si vous ne lui avez pas explicitement donné un nom, la connexion que vous avez ouverte est la connexion par défaut.

+0

Génial, merci beaucoup! –