QSqlQuery exec执行SQL语句失败

时间:2021-04-30 10:49:41
QString mySocket::login(QString userAndPassword)
{
     if(!connect2DB())
     {
         qDebug()<<"打开数据库发生错误!";
     }
     qDebug()<<"客户端传来的用户名和密码:"<<userAndPassword;

     QString strSQL = "SELECT * FROM login";
     QSqlQuery query;
     qDebug()<< query.exec(strSQL);

     while(query.next()) //遍历每一条记录
     {
         QString compare = query.value(0).toString() + "#" + query.value(1).toString();
         qDebug()<<compare;
         if(userAndPassword == compare)
         {
             QString typeofID = query.value(2).toString();
             db.close();
             return typeofID;
         }
     }
     db.close();
     QString error = "error";
     return error;
}

在服务器端进行数据库查询时,发现总是查询不到数据,通过qDebug()语句输出query.exec(strSQL)的return值,发现返回为false,查询失败。而且数据库成功打开,没有报错。下面是数据库的打开函数:

bool mySocket::connect2DB()
{
    if(QSqlDatabase::contains("qt_sql_default_connection"))
        db = QSqlDatabase::database("qt_sql_default_connection");
    else
        db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(databasePath);
    if(!db.open())
    {
        qDebug()<<"open database error!";
        return false;
    }
    return true;
}

其中databasePath的路径是“./hospital.db”,使用的是相对路径。后来尝试将相对路径改为绝对路径,就成功查询到数据。所以应该是相对路径的使用发生了错误。


相对路径“./hospital.db”中的“.”其实指的是项目路径,如下图:

QSqlQuery exec执行SQL语句失败

所以上面的相对路径对应的绝对路径应该是:
E:\database_homework\hospital_Server\build-hospital_server-Desktop_Qt_5_2_0_MinGW_32bit-Debug\hospital.db
但实际上我的数据库放在了:
E:\database_homework\hospital_Server\hospital_server\hospital.db

那么为什么打开数据时没有报错呢?到上面的相对路径下也发现了hospital.db文件,但是内容却是空的。之所以会出现能打开数据库却查询不到数据的问题,就是因为这个。在打开一个不存在的数据库文件时,它在指定的路径下去创建了一个同名的空数据库,所以上面的打开数据函数还是有问题,不能发现打开了错误的数据库,至于怎么修改还没想到。
这次问题的根本原因还是自己忘记了相对路径的正确使用方法,没有给出数据库的正确路径,给调试带来了很多麻烦,下次注意。