我终于在C ++ Qt中修复了我的MySQL连接。但是,当我尝试绑定值时,我收到以下错误:
QSqlError("2036", "QMYSQL3: Unable to bind value", "Using unsupported buffer type: 1701052421 (parameter: 1)")
我有这些文件:
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
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;
}
的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。在头文件中只是为了测试)
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();
}
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
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, "", "", "", "", "");
}
我希望这是所需的全部代码。我尝试使用questionmark除了:mem_id但没有运气。
答案 0 :(得分:5)
我不是C ++或Qt专家,也无法调试您的代码。
但是出于好奇,我开始调查您的代码,并在您的代码中发现可疑行(第2行):
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。我希望下次在您的帖子中包含这些重要信息,以便人们可以看到您的课程和功能,如:
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;
}
但恕我直言,事实并非如此。在你的情况下,它已经被执行,这就是你以后不能绑定任何参数的原因。因此,我建议您更改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 & val
。所以我会把你的电话改为:
result.bindValue(":mem_id", QVariant(id));
或
QVariant mem_id(id);
result.bindValue(":mem_id", mem_id);