C++ 如何使用cpp在qt中获取sqlite数据库中的行
如何访问sqlite数据库中的一行并在列表中返回数据。我试过这个C++ 如何使用cpp在qt中获取sqlite数据库中的行,c++,sqlite,qt,C++,Sqlite,Qt,如何访问sqlite数据库中的一行并在列表中返回数据。我试过这个 QList<QVariant> DBManager::getUserData(QString usrNam, QString psswrd) { QSqlQuery query; query.prepare("SELECT First_Name, Last_Name, Email, Username, Password" " FROM U
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;
}
QList DBManager::getUserData(QString usrNam,QString psswrd)
{
QSqlQuery查询;
查询.准备(“选择名字、姓氏、电子邮件、用户名、密码”
“来自用户名=:usrNam和密码=:psswrd”的用户”;
query.bindValue(“:usrNam”,usrNam);
query.bindValue(“:psswrd”,psswrd);
exec();
QSqlRecord rec=query.record();
QList列表;
int idCol=rec.indexOf(“名字”);
if(idCol==-1){
qDebug()如果要访问单行,不需要使用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;
}
然后使用User
类型的QVector
(而不是QList
):
QVector<User> list;
QVector列表;
QVector
将其数据存储在连续内存中,因此它比使用QList
更快。如果要访问一行,不需要使用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;
}
然后使用User
类型的QVector
(而不是QList
):
QVector<User> list;
QVector列表;
QVector
将其数据存储在连续内存中,因此它比使用QList
>更快,但程序崩溃。不是很有帮助。您是否尝试通过调试器运行它?程序到底在哪里崩溃?>但程序崩溃。不是很有帮助。您是否尝试通过调试器运行它?在哪里崩溃ly程序是否崩溃?感谢Qvector的建议。实现了您建议的解决方案,并返回了“未找到数据”,但数据库中有数据。运行query.isActive()和query.isSelect()并在这两种情况下均为true。尝试直接在数据库上运行完全相同的查询(使用sqlitestudio)。您的参数必须具有不正确的值。它正在运行!!!!!您是对的。我使用了错误的参数。错误发生在测试整个数据库管理器类时。我在检索数据之前测试了删除操作,因此在调用getUserData(…)时,用户已不存在。我的逻辑错误:(.ThanksThanks感谢Qvector建议。实现了您建议的解决方案,并返回了“未找到数据”,但数据库中有数据。运行query.isActive()和query.isSelect()并在这两种情况下均为true。尝试直接在数据库上运行完全相同的查询(使用sqlitestudio)。您的参数必须具有不正确的值。它正在运行!!!!!您是对的。我使用了错误的参数。错误发生在测试整个数据库管理器类时。我在检索数据之前测试了删除操作,因此在调用getUserData(…)时,用户已不存在。我的逻辑错误:(。谢谢