gpt4 book ai didi

c++ - Qt MySQL 查询 - 无法绑定(bind)值

转载 作者:可可西里 更新时间:2023-11-01 06:46:38 24 4
gpt4 key购买 nike

我终于在 C++ Qt 中修复了我的 MySQL 连接。但是,当我尝试绑定(bind)值时,出现以下错误:

QSqlError("2036", "QMYSQL3: Unable to bind value", "Using unsupported buffer type: 1701052421  (parameter: 1)")

我有这些文件:

引擎.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

引擎.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;
}

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

(query_prepare body temp. in header file just to test)

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();
}

成员 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

成员 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, "", "", "", "", "");
}

我希望这就是所需的全部代码。我尝试使用问号,除了 :mem_id 但也没有成功。

最佳答案

我不是 C++ 或 Qt 专家,无法调试您的代码。

但出于好奇,我开始调查您的代码并在您的代码中发现可疑行(第二行):

mysql_result result = engine::get_mysql().create_result("SELECT * FROM members WHERE member_id = ?");

因为我不是专家而且你没有提供任何includes 我不知道你的engine 命名空间是什么,也不知道函数get_mysql() 返回类型或 create_result 返回。

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

但是那个类型不支持任何create_result方法!所以我就卡在那里了。

接下来感谢谷歌,我找到了你的 another question一周前做的。下次我会在您的帖子中包含这些重要信息,以便人们可以看到您的类(class)和功能,例如:

mysql_result mysql::create_result(QString query)
{
return mysql_result(this->db.exec(query));
}

mysql_result::mysql_result(QSqlQuery query)
{
this->query = query;
}

现在我可以理解你的代码的第二行试图做什么了。

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

但是根据我在您的member_controller::get_member 中看到的算法,在我看来您只是处于准备 阶段但尚未执行。我看到了 Qt documentation不够清楚(而且我不是专家)因为:在数据库上执行 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;
}

但恕我直言,事实并非如此。在您的情况下,它已经执行,这就是为什么您以后不能绑定(bind)任何参数的原因。所以我建议你改变你的 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())
...
...

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

void mysql_result::add_parameter(QVariant value)
{
this->queryObject.addBindValue(value);
}

抱歉,恕我直言,这不是个好主意,几乎没有任何意义。

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

 result.bindValue(":mem_id", id);

其中 result 类型是 QSqlQuery 所以你正在调用本地方法 bindValue 其中根据文档的第二个参数是 const QVariant & 值。所以我会把你的电话改为:

 result.bindValue(":mem_id", QVariant(id));

 QVariant mem_id(id);
result.bindValue(":mem_id", mem_id);

关于c++ - Qt MySQL 查询 - 无法绑定(bind)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33105999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com