1 pièce(s) jointe(s)
SQlite : un SELECT * ne renvoie jamais rien
Bonjour a tous
Avant toutes choses, excusez moi ce titre peut parlant, mais je n'étais pas inspiré.
Je travaille sur une application mono utilisateur et j'ai besoin d'une base de donnée. Je me suis donc tourné vers SQLite. J'ai construit ma base de données avec l'utilitaire DB Browser SQLITE. Or, quand je veut l'utiliser dans mon code QT, elle ne me renvoie jamais rien. JE suis sous debian 10, avec QTCreator installé. Je n'ai aucune erreur de compilation.
Forme de la base de données :
Pièce jointe 546986
Le code qui se connecte a la bdd :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QtSql>
#include <QtSql/QSqlDriver>
#include <QtSql/QSqlDriverCreator>
#include <QtSql/QSqlError>
#include <QtSql/QSqlRecord>
QSqlDatabase bdd = QSqlDatabase::addDatabase("QSQLITE");
bdd.setDatabaseName("./basededonnees.db"); |
Après ca je teste son ouverture et si elle est bien ouverte je fait un select :
Code:
1 2
|
resultat = bdd.exec("SELECT * FROM Client"); |
je teste le résultat de exec et je met le résultat dans un QVector. Mais le problème, est que quand je fait cela, il ne renvoie rien, jamais.
Il faut impérativement que j'envoie une requete de type "INSERT INTO" pour que mes valeurs apparaissent.
Je voudrais savoir, si c'est normal de faire d'abord un INSERT INTO ou si on peut directement commencer par un "SELECT".
Merci d'avance pour vos réponses,
en espérant être assez clair dans mes esplications.
Lire une base SQLite avec Qt...
Bonjour,
Je viens justement de m'intéresser au sujet (mon épouse ayant eu quelques soucis avec une base de données généalogiques au format sqlite3).
Voilà comment j'ai procédé:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
QFile base(m_Base);
if (base.open(QIODevice::ReadOnly | QIODevice::Text)) //ouvre le fichier sqlite
{
db = QSqlDatabase::addDatabase("QSQLITE");//driver SQLITE pour base sqlite3
db.setDatabaseName(m_Base);
if (db.open())
{
QStringList list = db.tables(QSql::Tables);//éventuellement QSql::AllTables pour avoir toutes les tables
status(QString("Nbre de tables: %1").arg(list.size()));
qSort(list);//tri alpha
ui->tText->append(tList[i]);//liste les tables dans une fenêtre texte
//lister les champs d'une table donnée
QSqlRecord rec = db.record (table);
int nField =rec.count();//nombre de champs
QStringList list;//liste des champs de la table en cours
for (int i=0;i<nField;i++)
list << rec.fieldName(i);
//lister les enregistrements de la table
QSqlQuery q;
QString cmd("SELECT * FROM " + table );//demande tous les enregistrements de la table
bool flag = q.exec(cmd);//retourne vrai si la commande est exécutée
QSqlError err = q.lastError();//pour avoir une idée de l'erreur sinon
while (q.next()) //tous les enregistrements
{
QString line;
for (int i=0;i<list.size();i++)//tous les champs
{
int fNum = q.record().indexOf(list[i]);//index du champ i
line += QString("%1 ").arg(q.value(fNum).toString());//donnée du champ i
qApp->processEvents();
}
ui->tText->append(line);//affiche les champs de l'enregistrement et passe au suivant
}
}
} |
Dans ton cas, il faut peupler le QVector avec chacune des données de champs récupérées...