使用嵌入qt的mysql?

时间:2011-12-02 23:52:54

标签: mysql qt connection driver

我正在尝试使用嵌入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数据目录?

非常感谢任何帮助。

1 个答案:

答案 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驱动程序,也必须遵循它。