【问题标题】:How to fetch a row in an sqlite database in qt using cpp如何使用cpp在qt中的sqlite数据库中获取一行
【发布时间】:2020-11-11 03:00:28
【问题描述】:

如何访问 sqlite 数据库中的单行并返回列表中的数据。这个我试过了

QList<QVariant> DBManager::getUserData(QString usrNam, QString psswrd)
{
    QSqlQuery query;
    query.prepare("SELECT First_Name, Last_Name, Email, Username, Password"
                  " FROM Users WHERE Username = :usrNam AND Password = :psswrd");
    query.bindValue(":usrNam", usrNam);
    query.bindValue(":psswrd", psswrd);
    query.exec();

    QSqlRecord rec = query.record();
    QList<QVariant> list;
    int idCol = rec.indexOf("First_Name");

    if(idCol == -1){
        qDebug() << "Db is empty";
    }else{
        while(query.next()){
            list.append(query.value(idCol));
            list.append(query.value("Last_Name"));
            list.append(query.value("Email"));
            list.append(query.value("Username"));
            list.append(query.value("Password"));
        }
    }
    return list;
}

但是程序崩溃了。不完全了解的使用记录这里从文档中得到。我知道它提供了有关字段的详细信息,但我想要特定行的字段中的数据。

请帮忙 谢谢你

【问题讨论】:

  • > 但是程序崩溃了。 不是很有帮助。您是否尝试通过调试器运行它?程序到底在哪里崩溃了?

标签: c++ sqlite qt


【解决方案1】:

如果要访问单行,则无需使用QSqlRecord。只需使用 QSqlQuery::first 代替。示例:

QList<QVariant> DBManager::getUserData(QString usrNam, QString psswrd)
{
    QSqlQuery query;
    query.prepare("SELECT First_Name, Last_Name, Email, Username, Password"
                  " FROM Users WHERE Username = :usrNam AND Password = :psswrd");
    query.bindValue(":usrNam", usrNam);
    query.bindValue(":psswrd", psswrd);

    QList<QVariant> list;

    if (!query.exec()) {
        qDebug() << "Query failed!";
    } else {
        if (query.first()) { // get the first record in the result,
            list.append(query.value("First_Name"));
            list.append(query.value("Last_Name"));
            list.append(query.value("Email"));
            list.append(query.value("Username"));
            list.append(query.value("Password"));
        } else {
            qDebug () << "Data not found";
        }
    }

    return list;
}

不过,我建议使用Users 的数据结构,而不是使用QVariant。比如:

struct User {
    QString firstName;
    QString lastName;
    QString email;
    //...
};

然后使用User类型的QVector(而不是QList):

QVector<User> list;

QVector 将其数据存储在连续内存中,因此它比使用 QList 更快。

【讨论】:

  • 感谢 Qvector 的建议。实施您建议的解决方案并返回“未找到数据”,但数据库中有数据。 Ran query.isActive() 和 query.isSelect() 并在这两种情况下都为真。
  • 尝试直接在数据库上运行完全相同的查询(使用 sqlitestudio)。您的参数值必须不正确。
  • 它运行了!!!!!!你是对的,我使用了错误的参数。错误在于测试整个数据库管理器类。我在检索数据之前测试了删除,所以在调用 getUserData(...) 时,用户不再存在。我的一个逻辑错误:(。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多