2017-03-27 4 views
0

J'ai écrit un programme en Qt et j'ai récemment été confronté à ces 2 problèmes. Problème 1: J'ai une base de données sqlite avec 1 table et 4 colonnes (id, easy, medium, hard). Tous les ints. Donc, je veux vérifier si l'identifiant existe et est venu avec ce code:Qt (valeur sqlite et QVector <T> :: operator []: "index hors plage")

QSqlQuery queryCheck(db); 
    queryCheck.prepare("SELECT EXISTS(SELECT 1 FROM players WHERE id=':id' LIMIT 1)"); 
    queryCheck.bindValue(":id", c.getId()); 

Mais quand je lance

if(queryCheck.exec()) 

Je suis toujours vrai.

Problème 2: J'ai créé et rempli de chiffres, un

QVector<QVector<int>> gridBoxUnsolved(9); 
for(int outer=0; outer<gridBoxUnsolved.size(); ++outer) 
    gridBoxUnsolved[outer].resize(9); 

et je veux changer au hasard quelques valeurs à 0. Je pensais à chaque QVector « intérieure » pour changer 1 valeur aléatoire 0. Alors je suis venu avec ce code:

int iRand; 
qsrand(time(NULL)); 
for (int i=0;i<9;i++){ 
    iRand = (qrand()%9)+1; 
    gridBoxUnsolved[i][iRand]=0; 
} 

Cependant, parfois fonctionne Qt très bien, mais la plupart du temps les accidents et retourner ceci: échec ASSERT dans QVector :: operator []: « index sur range ", fichier /opt/Qt/5.8/gcc_64/include/QtCor e/qvector.h, ligne 437 Le programme s'est terminé de façon inattendue.

Répondre

0

J'ai donc trouvé la solution au problème.

QSqlQuery query(db); 
query.prepare("SELECT COUNT(*) AS N FROM table WHERE id=:id "); 

et après que vous faites cela pour vérifier:

query.exec(); 
query.next(); 
int N=query.value(0).toInt(); 
if(N) { 
    // You found the record 
} 
0

Essayez ceci:

QSqlQuery queryCheck(db); 
queryCheck.prepare("SELECT 1 FROM players WHERE id=':id' "); 
queryCheck.bindValue(":id", c.getId()); 

if(queryCheck.exec() && queryCheck.first()) // you found your guy 

Deuxième problème - supprimer le +1 dans

iRand = (qrand()%9)+1; 

qrand()%9 vous obtiendrez un nombre de 0 à 8, qui est ce que vous voulez.

+0

Merci pour votre réponse. Mon deuxième problème que je vois était stupide. Mais avec le premier j'ai un différent type de problème maintenant. Je poste tout le code que j'essaie de réaliser: – CrystalScrew

+0

if (queryCheck.exec() && queryCheck.first()) { qDebug() << "Base de données: Player Exist (SELECT Working)"; succès = vrai; } else if (queryCreate.exec()) { qDebug() << "Base de données: lecteur créé (INSERT Working)"; } else { qDebug() << "Base de données: Erreur lors de la vérification du lecteur:" << queryCheck.lastError(); qDebug() << "Base de données: Erreur lors de la création du lecteur:" << queryCreate.lastError(); } retour succès; } – CrystalScrew

+0

donc s'il trouve mon gars comme vous l'avez dit je veux retourner 1, sinon je veux le créer avec une autre requête qui est correcte et qui fonctionne dans mon code, mais ça va toujours à autre élément unique (ce qui est correct, car mon identifiant est unique) – CrystalScrew