2016-08-01 14 views
0

Ich baue eine QT-Anwendung, die Abfragen auf einer MySQL-Datenbank machen. Wenn ich query.exec("call SelectUsersPhotos()") mache, bekomme ich die Antwort ganz gut, aber wenn ich die Abfragezeichenkette auf prepare als Show auf dem Code unten setze, gibt die Datenbank keine Werte zurück und auch wirft es keine Fehler.Qt mysql Abfrage vorbereiten funktioniert nicht

if (db.open()) { 
    cout << "Querying GetUserPhotos from user " << user->Name << endl; 

    QSqlQuery query; 

    query.prepare("call SelectUsersPhotos()"); 
    query.exec(); 

    while (query.next()) { 
     UserPhoto *userPhoto = new UserPhoto(); 
     userPhoto->UserPhotoId = query.value(0).toInt(); 
     userPhoto->UserId  = query.value(1).toInt(); 
     userPhoto->Created  = query.value(2).toDateTime(); 
     userPhoto->Name  = query.value(3).toString().toStdString(); 
     usersPhotos->push_back(userPhoto); 
    } 

    query.finish(); 

    db.close(); 

    cout << "Photos " << usersPhotos->size() << endl; 
} 

Ressourcen: http://qt.developpez.com/doc/4.6/qsqlquery/

Antwort

-1

"Bereitet die SQL-Abfrage Abfrage zur Ausführung Gibt true zurück, wenn die Abfrage erfolgreich vorbereitet wird, andernfalls false.."

vielleicht sollten Sie

bool b = query.prepare("call SelectUsersPhotos()"); 
while(!b) 
    b = query.prepare("call SelectUsersPhotos()"); 
query.exec(); 

EDIT versuchen: Funktion Signatur ist

bool QSqlQuery::prepare (const QString & query) 

so muss er die Adresse des Wertes, aber u sind ein R-Wert als Parameter übergeben. Vielleicht sollte u

QString qstr("call SelectUsersPhotos()"); 
query.prepare(qstr); 
query.exec(qstr); 

note versuche ich weiß nicht, warum exec (const QString & Abfrage) funktioniert auch, wenn sie den gleichen Bezugs Parameter hat.

+0

query.prepare gibt sofort true zurück und es gibt immer noch nichts zurück. –

+1

Warum riskieren Sie für immer eine Schleife, wenn die Abfrage ungültig ist und - wie wahrscheinlich - nach einiger Zeit nicht plötzlich gültig wird? Scheint wie ein schlechter Rat. Und verweist '! =' Adressen von Werten. Ein Ref kann weg optimiert werden, ersetzt durch einen Wert ohne Adresse. Wenn die Adresse des Referenten genommen wird, ist das anders. Genauer gesagt: Ein 'const &' kann sich gut an einen temporären rvalue binden, der lebenslang auf den Bereich der Referenz erweitert wird. z.B. hast du nie einen rvalue an eine Funktion übergeben, die 'std :: string' verwendet? Es funktioniert gut. Und deshalb hängt es nicht mit der gestellten Frage zusammen. –