2017-03-17 2 views
0

J'ai besoin de remplir un QTableView en récupérant des données d'un objet QSqlTableModel. J'utilise des commandes suivantes pour établir une connexion à une base de données de serveur SQL:Erreur "Impossible de trouver la table" lors de l'appel de la méthode setTable QSqlTableModel

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); 
QString connectionTemplate = "DRIVER={SQL Native Client};SERVER=%1;DATABASE=%2;Uid=username;Pwd=password;Trusted_Connection=Yes;"; 
QString connectionString = connectionTemplate.arg("localhost").arg("mydb"); 
db.setDatabaseName(connectionString); 

I valider la connexion de base de données par les méthodes isValid() et open() de la classe QSqlDatabase. Je suis également capable d'interroger correctement les tables de la base de données. Tout va bien jusqu'ici. Mais le problème se pose lorsque j'utilise les commandes suivantes:

QSqlTableModel* model = new QSqlTableModel(parent,db); 
model->setTable("mytable"); 
qDebug() << model->lastError().text(); // the error message is printed on consul. 

La méthode setTable ne fonctionne pas et provoque une erreur: Impossible de trouver la table \ « matable \ ».

+0

est là une table nommée précisément base de données « matable » dans votre « mydb »? Si oui, pouvez-vous interroger avec succès à partir d'un autre client SQL? – Edd

+0

@Edd, oui je l'ai. Je peux lire l'interroger par QSQLQuery sans aucun problème. –

Répondre

0

Selon http://doc.qt.io/qt-5/qsqltablemodel.html#QSqlTableModel le constructeur de QSqlTableModel:

Creates an empty QSqlTableModel and sets the parent to parent and the database connection to db. If db is not valid, the default database connection will be used.

Dans le cas où votre objet db n'est pas valide vous connecter à une base de données par défaut où votre table ne sont pas disponibles.

Vérifiez les paramètres utilisés pour initialiser et configurer QSqlDatabase db.

+0

Comme je l'ai dit, la connexion à la base de données est correcte car les méthodes isValid() et open() de mon objet QSQLDatabase renvoient true. Je peux interroger la base de données par QSQLQuery. –

+0

Mh, si vous dites que l'objet db ** same ** fonctionne bien avec QSQLQuery alors je ne suis pas trop sûr. Peut-être essayer de mettre à jour votre réponse avec l'instruction CREATE utilisée pour créer la table, afin que les gens puissent avoir des informations supplémentaires pour résoudre ce problème. – Edd

0

J'ai trouvé la solution. J'ouvre la base de données juste après setDatabaseName et avant la création de QSqlTableModel:

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); 
QString connectionTemplate = "DRIVER={SQL Native Client};SERVER=%1;DATABASE=%2;Uid=username;Pwd=password;Trusted_Connection=Yes;"; 
QString connectionString = connectionTemplate.arg("localhost").arg("mydb"); 
db.setDatabaseName(connectionString); 
db.open(); // :) 
QSqlTableModel* model = new QSqlTableModel(parent,db); 
model->setTable("mytable");