心锁711 2024-06-11 02:12 采纳率: 0%
浏览 28
已结题

Qt数据库查询语句查询id返回为空

问题遇到的现象和发生背景

Qt做个学校项目,用到了sql,创建一个用户库之后通过username查询userid,查询结果一直为空


QTcpServer* tcpServer = new QTcpServer(this);
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("database.db");
    if (!db.open())
    {
        qDebug("数据库不能打开");
    }
    QSqlQuery query(db);
    // 创建user表
    if (!tableExists("user", db)) {
        if (!query.exec("CREATE TABLE user ("
                        "user_id INT IDENTITY(1,1) PRIMARY KEY,"
                        "username NVARCHAR(20) NOT NULL,"
                        "paswd NVARCHAR(20) NOT NULL,"
                        "ifonline BIT NOT NULL)"
                        )) {
            qDebug() << "创建user表失败:" << query.lastError().text();
        }
    } else {
        qDebug() << "表user已存在,跳过创建";
    }
    // 创建pkm表
    if (!tableExists("pkm", db)) {
        if (!query.exec("CREATE TABLE pkm ("
                        "pokemon_id INT IDENTITY(1,1) PRIMARY KEY,"
                        "name NVARCHAR(20) NOT NULL,"
                        //   "pname NVARCHAR(20) NOT NULL,"
                        "level INT NOT NULL,"
                        "experience INT NOT NULL"")"
                        )) {
            qDebug() << "创建pkm表失败:" << query.lastError().text();
        }
    } else {
        qDebug() << "表pkm已存在,跳过创建";
    }
    // 创建user_pkm_relations表
    if (!tableExists("user_pkm_relations", db)) {
        if (!query.exec("CREATE TABLE user_pkm_relations ("
                        "user_id INT NOT NULL,"
                        "pokemon_id INT NOT NULL,"
                        "PRIMARY KEY (user_id, pokemon_id),"
                        "FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE ON UPDATE CASCADE,"
                        "FOREIGN KEY (pokemon_id) REFERENCES pkm(pokemon_id) ON DELETE CASCADE ON UPDATE CASCADE)"
                        )) {
            qDebug() << "创建user_pkm_relations表失败:" << query.lastError().text();
        }
    } else {
        qDebug() << "表user_pkm_relations已存在,跳过创建";
    }
    tcpServer->listen(QHostAddress::Any, 8080);
    connect(tcpServer, &QTcpServer::newConnection, [=]()
            {
                QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
                connect(clientSocket, &QTcpSocket::readyRead, [=]()  {
                    // 当有数据可读时,此槽函数会被触发
                    qDebug()<<clientSocket->property("username").toString();
                    QDataStream in(clientSocket);
                    in.setVersion(QDataStream::Qt_5_15); // 确保版本与客户端一致
                    QDataStream out(clientSocket);
                    out.setVersion(QDataStream::Qt_5_15);
                    Request request;
                    in >> request;
                    // 处理请求
                    Response response;
                    switch (request.type) {
                    case RequestType::Register:
                        // 注册逻辑
                        response.success = handleRegistration(db,request.username, request.password);
                        response.message = 0;
                        break;
case RequestType::lvfight:

                    {
                        qDebug("开始lvfight");
                        qDebug()<<"username"<<clientSocket->property("username").toString();
                            QString pokemanName = request.password;
                            int userId = getUserIdFromUsername(db, clientSocket->property("username").toString());


```问题出在 getUserIdFromUsername函数:



```c++
int getUserIdFromUsername(QSqlDatabase db, const QString& username)
{
    QSqlQuery query(db);
    query.prepare("SELECT user_id FROM user WHERE username = ?");
    query.addBindValue(username);
    if (!query.exec()) {
        qDebug() << "查询用户ID失败:" << query.lastError().text();
        return -1; // 返回-1表示查询失败
    }
    if (query.next()) {
    QVariant value = query.value(0);
    qDebug() << "原始数据类型:" << value.typeName();
        qDebug() << "原始数据值:" << value;
        int id = value.toInt();
    qDebug() << "转换后的整数值:" << id;
    return id; // 返回找到的用户ID
    } else {
        return -1; // 如果没找到该用户,也返回-1
    }
}

这个函数在我一次注册之后输出信息:表user已存在,跳过创建
表pkm已存在,跳过创建
表user_pkm_relations已存在,跳过创建
""
用户ID: 8
注册成功,赠送小精灵给用户。
开始赠送小精灵
chenggong
新插入的精灵的 ID 是: 15
chenggong
新插入的精灵的 ID 是: 16
用户ID: 8
关联成功
关联成功
0 true ""
""
denglu

登录成功,用户在线状态已更新为在线。
1 true ""
"8"
开始lvfight
username "8"
原始数据类型: QString
原始数据值: QVariant(QString, "")
转换后的整数值: 0
No associated pokemon found for the user

操作环境、软件版本等信息

Qt

尝试过的解决方法

刮破了头皮也没想明白是怎么回事
6.11进展
我又在数据库里创建了一张新表:

if (!tableExists("username_id_relations", db)) {
        if (!query.exec("CREATE TABLE username_id_relations ("
                        "user_id INT NOT NULL,"
                        "username NVARCHAR(20) NOT NULL,"
                        "PRIMARY KEY (user_id),"
                        "UNIQUE (username),"
                        "FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE ON UPDATE CASCADE"
                        ")"
                        )) {
            qDebug() << "创建username_id_relations表失败:" << query.lastError().text();
        }
    } else {
        qDebug() << "表username_id_relations已存在,跳过创建";
    }


然后在getUserIdFromUsername函数里直接用这张新表就能查到正确id,用原来的user表却不能


int getUserIdFromUsername(QSqlDatabase db, const QString& username)
{
    QSqlQuery query(db);
    query.prepare("SELECT user_id FROM username_id_relations WHERE username = ?");
    query.addBindValue(username);
    if (!query.exec()) {
        qDebug() << "查询用户ID失败:" << query.lastError().text();
                                                 return -1; // 返回-1表示查询失败
    }
    if (query.next()) {
        QVariant value = query.value(0);
        qDebug() << "原始数据类型:" << value.typeName();
        qDebug() << "原始数据值:" << value;
        int id = value.toInt();
        qDebug() << "转换后的整数值:" << id;
        return id; // 直接返回找到的用户ID
    } else {
        return -1; // 如果没找到该用户,也返回-1
    }
}
我想要达到的结果

我想实现成功查询id
解释一下为什么新建一张表在注册的时候额外存储一下信息就能在这张表里查到,原来的user表查不到

  • 写回答

22条回答 默认 最新

  • Roc-xb 领域专家: 后端开发技术领域 2024-06-11 06:00
    关注
    获得0.45元问题酬金

    看起来你的问题是 getUserIdFromUsername 函数返回的用户 ID 始终为空。根据你提供的调试信息,clientSocket->property("username") 返回的值是 "8",这显然不是一个有效的用户名,而是一个字符串形式的用户 ID。

    可能的问题和解决方案

    1. 用户名存储和传递问题:
      • 你在 clientSocket->property("username") 中存储的值可能是用户 ID 而不是用户名。你需要确保在用户登录时正确存储用户名。
    2. 查询语句问题:
      • 你的查询语句中使用了 username 作为查询条件,但你传递的是用户 ID。

    解决方案

    确保正确存储用户名

    在用户登录时,确保你在 clientSocket 的属性中存储的是用户名而不是用户 ID。例如:

    // 登录成功后,存储用户名
    clientSocket->setProperty("username", request.username);
    

    修改 getUserIdFromUsername 函数

    确保 getUserIdFromUsername 函数接收到的是用户名并正确查询用户 ID。

    int getUserIdFromUsername(QSqlDatabase db, const QString& username)
    {
        QSqlQuery query(db);
        query.prepare("SELECT user_id FROM user WHERE username = ?");
        query.addBindValue(username);
        if (!query.exec()) {
            qDebug() << "查询用户ID失败:" << query.lastError().text();
            return -1; // 返回-1表示查询失败
        }
        if (query.next()) {
            QVariant value = query.value(0);
            qDebug() << "原始数据类型:" << value.typeName();
            qDebug() << "原始数据值:" << value;
            int id = value.toInt();
            qDebug() << "转换后的整数值:" << id;
            return id; // 返回找到的用户ID
        } else {
            return -1; // 如果没找到该用户,也返回-1
        }
    }
    

    调试信息

    lvfight 请求处理逻辑中,确保你传递的是用户名:

    qDebug("开始lvfight");
    qDebug() << "username" << clientSocket->property("username").toString();
    QString pokemanName = request.password;
    QString username = clientSocket->property("username").toString();
    int userId = getUserIdFromUsername(db, username);
    

    通过这些调整,你应该能够成功查询到用户 ID。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月19日
  • 修改了问题 6月11日
  • 赞助了问题酬金15元 6月11日
  • 创建了问题 6月11日