Qt:将SQL查询结果保存在变量中,在SQL查询中使用C++变量

Qt:将SQL查询结果保存在变量中,在SQL查询中使用C++变量,c++,mysql,qt,C++,Mysql,Qt,我的项目是编写一个简单的ShopApp。一个功能是检查是否有足够的库存,以便客户可以购买他想要购买的任何东西。这些函数看起来像cart是std::vector,Pid代表产品id: bool sqlfunctions::checkStock(){ QSqlQuery query; int diff, stock; for(iter cursor = cart.begin();cursor!=cart.end();cursor++){ query.prepa

我的项目是编写一个简单的ShopApp。一个功能是检查是否有足够的库存,以便客户可以购买他想要购买的任何东西。这些函数看起来像cart是std::vector,Pid代表产品id:

bool sqlfunctions::checkStock(){
    QSqlQuery query;
    int diff, stock;
    for(iter cursor = cart.begin();cursor!=cart.end();cursor++){
        query.prepare("SELECT stock FROM products WHERE id = cursor->getPid()");
        query.exec();
        // Need to save result of query into variable stock
        stock = ??;
        diff = stock - cursor->getAmount;
        if(diff < 0){
            return false;
        }
    }
    return true;
}
最后一个msgBox的预期msgBox为:

The stock is: 100 
The placeholder value is: 2
输出实际上是:

The stock is: 0
The placeholder value is: 2
如果我改为尝试选择一个字符串,例如productName,比如QString myProductName=query.value0.toString和代码中的相应更改,则返回的将是一个空字符串


**已解决:*请参见接受答案中Floris的评论。我错过了下一个

事实上,这很直截了当:

QSqlQuery query;
query.prepare("Select stock from products where id = :input");
query.bindValue(":input", cursor->getPid());
query.exec();
将值绑定到字符串中的参数。参数的格式为::name。还有位置绑定,它按照看到的顺序进行绑定

QSqlQuery query;
query.prepare("Select stock from products where id = ?");
// No need for an identifier
query.bindValue(cursor->getPid());
query.exec();
要迭代从查询中获得的记录,可以执行以下操作:

QSqlQuery query;
query.prepare("SELECT stock FROM employee WHERE id = ?");
query.bindValue(cursor->getPid());
query.exec();

if (query.next()) {
    int stock = query.value(0).toInt();
    // You could store the information you obtain here in a vector or something
}
您还可以将prepare语句置于for循环之外。如果您对从select语句中迭代多条记录感兴趣,可以用while语句替换If语句

关于QSqlQuery::下一步:

检索结果中的下一条记录(如果可用),并将查询定位在检索到的记录上。请注意,结果必须处于活动状态,并且isSelect必须在调用此函数之前返回true,否则它将不执行任何操作并返回false


。您需要先拨打此电话,然后才能使用.valueint访问记录。

感谢您的书面解释。不过,你能看看我的编辑吗?“它似乎还不起作用。@Alex答案是你忘了实际调用下一行进行读取。注意我在答案中的最后一个例子:if query.next{int stock=query.value0.toInt;}。不请求结果的第一行而请求值将不会给出正确答案!如果您添加查询,它应该可以工作。next.FYI:如果您正在寻找类似于swprintf__s的Qt等价字符串格式,请阅读QString类的文档,特别是各种QString::arg函数。感谢您提供的信息!
QSqlQuery query;
query.prepare("SELECT stock FROM employee WHERE id = ?");
query.bindValue(cursor->getPid());
query.exec();

if (query.next()) {
    int stock = query.value(0).toInt();
    // You could store the information you obtain here in a vector or something
}