我正在尝试使用嵌入QT的mysql。我已经有一个与mysqld链接的Qt mysql插件。该插件可以很好地加载嵌入式数据库,但QT没有简单的方法来设置像dataDir这样的嵌入式选项。我在这里看到:http://doc.qt.io/archives/qt-4.7/qsqldatabase.html#addDatabase-2我可以使用必要的嵌入参数启动QT sql驱动程序(QMYSQLDriver),所以我做了:
#include <QtCore/QCoreApplication>
#include <QtSql>
#include "QMYSQLDriver"
#include <mysql.h>
int main(int argc, char *argv[])
{
//QCoreApplication a(argc, argv);
{
QSqlDatabase mydb;
MYSQL *mysql;
static char *server_options[] = \
{ "mysql_test", "--defaults-file=/home/cquiros/temp/mysql/my.cnf", NULL };
int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;
static char *server_groups[] = { "embedded", NULL };
qDebug() << "Loading embedded";
mysql_library_init(num_elements, server_options, server_groups);
mysql = mysql_init(NULL);
mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "embedded");
mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);
mysql_real_connect(mysql, NULL,NULL,NULL, "database1", 0,NULL,0);
//mydb = QSqlDatabase::addDatabase("QMYSQLE","mydb"); //Add the database connector to MySQL
QMYSQLDriver *drv = new QMYSQLDriver(mysql);
mydb = QSqlDatabase::addDatabase(drv,"connection1"); //Add the database connector to MySQL
qDebug() << "Embedded driver added";
mydb.setDatabaseName("test");
if (!mydb.open()) //Try to opens the database
{
qDebug() << "Error while opening the database";
}
else
{
qDebug() << "DB test opened";
QSqlQuery tables(mydb);
QString sql;
sql = "SELECT count(*) FROM system";
if (tables.exec(sql))
{
tables.first();
qDebug() << "Total records is: " << tables.value(0).toString() << " ok.";
}
else
{
qDebug() << tables.lastError().databaseText();
}
}
}
qDebug() << "Closing DB";
QSqlDatabase::removeDatabase("connection1");
qDebug() << "DB closed";
//return a.exec();
qDebug() << "En of program....";
}
这样可行,QSqlQuery与嵌入式数据库一起正常工作,但是当我用
删除数据库时,QMYSQLDriver会出现分段错误QSqlDatabase::removeDatabase("connection1");
这是因为QMYSQLDriver在第1337行执行此操作:
mysql_close(d->mysql);
我不知道QT驱动程序崩溃的原因。另外我不知道这是否是QT连接到嵌入式mysql数据库的正确方法,它可能不是,但是如何设置mysql数据目录?
非常感谢任何帮助。
答案 0 :(得分:0)
当你看Qt代码时,就是说
// comment the next line out if you want to use MySQL/embedded on Win32 systems.
// note that it will crash if you don't statically link to the mysql/e library!
# define Q_NO_MYSQL_EMBEDDED
所以你必须创建你的静态链接,但是现在mysql无法通过mingw开箱即可编译,你可以找到一些补丁可以实现。
我认为这与Qt插件机制存在冲突,即使您制作了自己的mysql驱动程序,也必须遵循它。