2010-07-29 7 views
4

Je travaille sur une petite application dans Qt et j'utilise la bibliothèque SQL avec SQLite comme base de données. Jusqu'à présent, cela a bien fonctionné. La classe QSqlQuery fournit uniquement une méthode pour obtenir les valeurs de colonne par index au lieu de nom de zone. Toutefois, en utilisant la fonction record(), la ligne en cours sur la requête peut être transformée en QSqlRecord, qui a la fonction value() pour obtenir des valeurs par nom de zone.QtSql: QSqlRecord ne conserve pas les préfixes de la table

Donc, cela fonctionne très bien et me permet d'écrire du code plus court et plus propre, mais une requête de jointure comme ce qui suit apporte des problèmes:

SELECT t1.*, t2.* FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id 

Nous exécutons cette requête comme d'habitude, et convertir une rangée à un enregistrement. Mais il s'avère que les noms de colonnes dans le QSqlRecord ne sont pas préfixés avec le nom de la table - par exemple, il y a deux colonnes appelées id qui se trouvent dans l'objet d'enregistrement. C'est évidemment un peu problématique.

Quelle est la meilleure solution à ce problème?

(je l'ai trouvé dans le this issue bug tracker Qt, mais ce n'est pas d'un grand secours.)

+0

J'ai un problème similaire en utilisant un alias de sous-requêtes et d'instructions de cas, de sorte que mon travail est effectué par Sqllite. Malheureusement, lorsqu'il est apparu dans SqlRecord, il n'y a qu'un seul jeu de champs, donc je ne peux même pas accéder à mes données de quelque façon que ce soit (par identifiant ou par nom de champ). Quelqu'un at-il une solution? – gollumullog

Répondre

6

Le nom du champ est totalement dépendant du conducteur; donc le problème est vraiment avec SQLite lui-même, qui pourrait faire la chose «correcte» après tout (correct, comme dans les normes SQL, que je n'ai pas vérifié).

Quoi qu'il en soit, la solution facile: il suffit de donner à vos champs un alias dans le SQL lui-même, bien que, vous ne pouvez pas, et ne devrait vraiment pas, utilisez select * from:

SELECT t1.id TI_ID, t1.name TI_NAME, t2.id T2_ID FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id 
+0

Pour ce que ça vaut, le pilote MySQL Qt a aussi ce comportement. –

+0

@Tyler Mon intuition est que c'est le bon comportement. – Gianni

1

J'ai trouvé ce problème aussi bien mais a découvert que si vous utilisez le QSqlQueryModel pour créer votre QSqlRecord il fonctionne très bien:

QSqlQueryModel *model = new QSqlQueryModel; 
model->setQuery("SELECT t1.id TI_ID, t1.name TI_NAME, t2.id T2_ID FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id"); 

int TI_ID   = model->record(0).value("TI_ID").toInt(); 
int TI_ID   = model->record(0).value(0).toInt(); 
QString TI_NAME  = model->record(0).value("TI_NAME").toString(); 
QString TI_NAME_from_id= model->record(0).value(1).toString(); 

vous devriez obtenir les mêmes valeurs pour l'identification et le nom en utilisant les deux styles.

Questions connexes