小白N+ 2024-09-10 17:41 采纳率: 0%
浏览 4

qt操作mysql时遇到莫名其妙的问题

代码如下:


//首先创建数据驱动
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    //基本的设置
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("1234");
    db.setDatabaseName("qt_db");

    //打开数据库 建立连接
    bool isok = db.open();

    if(isok)
    {
        qDebug() << "success" ;
        QString aa = "%o%";
        //SELECT * FROM user WHERE username LIKE '%o%'
        QString sql = "SELECT * FROM user WHERE username LIKE:match";
        QSqlQuery query;
        query.prepare(sql);
        query.bindValue(":match", aa);
        if(!query.exec(sql))
        {
            qDebug() << query.lastError().text();
        }
        while(query.next())
        {
            qDebug() << QString("Id: %1, Username: %2, Password: %3")
                                .arg(query.value("id").toInt())
                                .arg(query.value("username").toString())
                                .arg(query.value("password").toString());
        }
        return 0;
    }else
    {
        qDebug() <<"fail " << db.lastError();
        return -1;
    }

当在QT中执行上面代码时,会报:

success
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':match' at line 1 QMYSQL: Unable to execute query"

各位看看,为什么会这样

  • 写回答

2条回答 默认 最新

  • 一轮明月照丘壑 2024-09-10 17:42
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的SQL查询语句存在问题。在你的代码中,你试图使用占位符 :match 来绑定你的查询参数,但是在 SQL 查询语句中并没有正确地使用占位符。你的查询语句应该使用问号 (?) 作为占位符,而不是冒号 (:) 作为占位符。此外,LIKE 操作符需要一个百分号 (%) 作为通配符,用来匹配任何字符序列。因此,你应该这样写你的 SQL 查询语句:

    QString sql = "SELECT * FROM user WHERE username LIKE ?";
    query.bindValue(0, aa);  // 注意这里的索引值 0,表示第一个问号的位置
    

    另外,请注意 bindValue 的第二个参数是你想要绑定的值,而不是占位符的名称。在这个例子中,你应该传递 aa 的值作为参数,而不是字符串 :match。你的 bindValue 函数中的参数应该是一个整数索引,这个索引代表了你的查询语句中的占位符的位置。在这种情况下,只有一个占位符(问号),所以我们使用索引值 0。你的代码修改后应如下:

    //首先创建数据驱动
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    //基本的设置
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("1234");
    db.setDatabaseName("qt_db");
    
    //打开数据库 建立连接
    bool isok = db.open();
    
    if(isok)
    {
        qDebug() << "success";
        QString aa = "%o%";
        QString sql = "SELECT * FROM user WHERE username LIKE ?"; // 修改这里
        QSqlQuery query;
        query.prepare(sql); // 准备查询语句
        query.bindValue(0, aa); // 使用索引值 0 来绑定值
        if(!query.exec()) // 这里不需要再次传递sql参数,因为我们已经通过prepare()准备好了查询语句
        {
            qDebug() << query.lastError().text();
        }
        while(query.next())
        {
            qDebug() << QString("Id: %1, Username: %2, Password: %3")
                                .arg(query.value("id").toInt())
                                .arg(query.value("username").toString())
                                .arg(query.value("password").toString());
        }
        return 0;
    }else
    {
        qDebug() <<"fail " << db.lastError();
        return -1;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 9月10日