2016-08-01 97 views
0

我正在构建一个QT应用程序,用于查询MySQL数据库。当我做query.exec("call SelectUsersPhotos()")时,我得到的响应很好,但如果我在prepare上设置查询字符串,如下面的代码所示,数据库不会返回任何值,也不会引发任何错误。Qt mysql查询准备不起作用

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; 
} 

资源:http://qt.developpez.com/doc/4.6/qsqlquery/

回答

-1

“准备SQL查询的查询执行如果查询成功制备返回true;否则返回false。”

也许你应该试着

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

编辑: 函数签名是

bool QSqlQuery::prepare (const QString & query) 

所以它需要的值的地址,但u的传递右值作为参数。也许ü应该尝试

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

笔记,我不知道为什么EXEC(常量QString的&查询)的作品,即使有相同的参考参数。

+0

query.prepare立即返回true,它仍然不返回任何内容。 –

+1

如果查询无效并且 - 可能 - 在某些延迟后不会突然变为有效,那么为什么您会永远冒险循环?看起来像不好的建议。并引用'!='值的地址。一个ref可以被优化掉,用一个值替换,没有地址。如果所指对象的地址被采纳,那就不同了。更重要的是:'const&'可以很好地绑定到一个临时右值,这会导致它被终生扩展到引用的范围。例如你有没有传递一个函数采用'std :: string'的右值?它工作得很好。因此它与被问到的问题无关。 –