Qt MySQL Query - 无法绑定值

Jos*_*ker 6 c++ mysql qt

我终于在C++ Qt中修复了我的MySQL连接.但是,当我尝试绑定值时,我收到以下错误:

QSqlError("2036", "QMYSQL3: Unable to bind value", "Using unsupported buffer type: 1701052421  (parameter: 1)")
Run Code Online (Sandbox Code Playgroud)

我有这些文件:

Engine.h:

#ifndef ENGINE_H
#define ENGINE_H

#include "database/mysql.h"

class engine
{
private:
    static mysql* _mysql;
public:
    static void initialize();
    static void destroy();

    static mysql get_mysql();
};

#endif // ENGINE_H
Run Code Online (Sandbox Code Playgroud)

Engine.cpp:

#include "engine.h"
#include "entities/member_controller.h"
#include <QDebug>

mysql* engine::_mysql;

void engine::initialize()
{
    _mysql = new mysql();

    member* mem = member_controller::get_member(1);
    qDebug() << "mem name = " << mem->getFirstName() << " " << mem->getSecondName();
    delete mem;
}

void engine::destroy()
{
    delete _mysql;
}

mysql engine::get_mysql()
{
    return *_mysql;
}
Run Code Online (Sandbox Code Playgroud)

mysql.h中:

#ifndef MYSQL_H
#define MYSQL_H

#include <QtSql>
#include <QString>
#include "mysql_result.h"

class mysql
{
private:
    QSqlDatabase db;
public:
    mysql();
    ~mysql();
    mysql_result create_result(QString query);
    QSqlError error();

    QSqlQuery query_prepare(QString query1)
    {
        QSqlQuery query(this->db);
        query.prepare(query1);
//        this->query = query;
        return query;
    }
};

#endif // MYSQL_H
Run Code Online (Sandbox Code Playgroud)

(query_prepare body temp.在头文件中只是为了测试)

mysql.cpp

#include "mysql.h"

mysql::mysql()
{
    this->db = QSqlDatabase::addDatabase("QMYSQL", "QMYSQL");
    this->db.setHostName("localhost");
    this->db.setUserName("root");
    this->db.setPassword("Eequi4");
    this->db.setDatabaseName("test");
    this->db.open();
}

mysql::~mysql()
{
}

QSqlError mysql::error()
{
    return this->db.lastError();
}
Run Code Online (Sandbox Code Playgroud)

member_controller.h:

#ifndef MEMBER_CONTROLLER_H
#define MEMBER_CONTROLLER_H

#include <QString>
#include "member.h"

class member_controller
{
public:
   static member* get_member(unsigned int id);
   static member* get_member(QString email);
};

#endif // MEMBER_CONTROLLER_H
Run Code Online (Sandbox Code Playgroud)

member_controller.cpp:

#include "member_controller.h"
#include "database/mysql_result.h"

#include "engine.h"
#include "database/mysql_result.h"
#include <QtSql/QSqlQuery>

member* member_controller::get_member(unsigned int id)
{
    QSqlQuery result = engine::get_mysql().query_prepare("SELECT * FROM members WHERE member_id = :mem_id");
    result.bindValue(":mem_id", id);

    if (result.exec() && result.first())
    {
        return new member(id, result.value("first_name").toString(), result.value("second_name").toString(), result.value("screen_name").toString(), result.value("email").toString(), result.value("status").toString());
    }
    else
    {
        qDebug() << engine::get_mysql().error() << "\n";
        qDebug() << result.lastError() << "\n";
    }

    return new member(0, "", "", "", "", "");
}
Run Code Online (Sandbox Code Playgroud)

我希望这是所有需要的代码.我尝试使用questionmark除了:mem_id但没有运气.

Ale*_*lex 5

我不是C++或Qt专家,也没有可能调试你的代码.

但仅仅是因为好奇,我开始调查你的代码,并在你的代码中找到可疑行(第二个):

mysql_result result = engine::get_mysql().create_result("SELECT * FROM members WHERE member_id = ?");
Run Code Online (Sandbox Code Playgroud)

由于我不是专家,你没有提供任何includes我不知道你的engine命名空间和函数get_mysql()返回类型是什么,也不知道create_result返回.

所以我做了一些猜测:get_mysql()可能会返回QSqlDatabase对象?不是吗?

但是那种类型不支持任何create_result方法!所以我卡在那里.

接下来感谢谷歌我已经找到了你一周前提出的另一个问题.我希望下次在您的帖子中包含这些重要信息,以便人们可以看到您的课程和功能,如:

mysql_result mysql::create_result(QString query)
{
    return mysql_result(this->db.exec(query));
}
Run Code Online (Sandbox Code Playgroud)

mysql_result::mysql_result(QSqlQuery query)
{
    this->query = query;
}
Run Code Online (Sandbox Code Playgroud)

现在我可以理解你的代码的第二行正在尝试做什么.

我在这里看到的可疑之处是return mysql_result(this->db.exec(query));.这似乎是根据您尝试执行查询的函数名称并从mysql服务器获取结果.

但根据我在你member_controller::get_member看来的算法,在我看来,你只是在准备阶段但尚未执行.我看到Qt文档不够清晰(并且我不是专家)因为:在数据库上执行SQL语句并返回一个QSqlQuery对象.从技术上讲,你可以说你有QSqlQuery结果,你可以期望这个结果与你做的完全一样:

//mysql_result mysql::create_result(QString query)
QSqlQuery  mysql::query_prepare(QString query)
{
    QSqlQuery query(this->db);
    query.prepare(query);
    this->query = query;
    return this->query;
}
Run Code Online (Sandbox Code Playgroud)

但恕我直言,事实并非如此.在你的情况下,它已经被执行,这就是你以后不能绑定任何参数的原因.所以我建议你改变你的mysql_result mysql::create_result(QString query)或创造另一个QSqlQuery mysql::query_prepare(QString query)对我更有意义的功能.并将您的第一行代码更改为:

member* member_controller::get_member(int id)
{
    QSqlQuery query = engine::get_mysql().query_prepare("SELECT * FROM members WHERE member_id = ?");
    query.addBindValue(value);

    if (query.exec() && query.first())
...
...
Run Code Online (Sandbox Code Playgroud)

最后一点我不明白你为什么要重新发明这个?如果你已经拥有了对我来说非常好的Qt mysql类,为什么要用一行调用Qt方法创建自己的类和方法,如:

void mysql_result::add_parameter(QVariant value)
{
    this->queryObject.addBindValue(value);
}
Run Code Online (Sandbox Code Playgroud)

对不起,但恕我直言,这是不是很好的主意,几乎没有任何意义.

更新查看更新的代码,我看到:

 result.bindValue(":mem_id", id);
Run Code Online (Sandbox Code Playgroud)

其中resulttype是QSqlQuery调用本机方法bindValue,其中第二个参数根据文档而定const QVariant & val.所以我会改变你的电话:

 result.bindValue(":mem_id", QVariant(id));
Run Code Online (Sandbox Code Playgroud)

要么

 QVariant mem_id(id);
 result.bindValue(":mem_id", mem_id);
Run Code Online (Sandbox Code Playgroud)