sql数据库更改有没有qt信号?

时间:2014-04-07 15:19:55

标签: c++ sql qt qsqldatabase change-notification

我用Qt编写了一个C ++程序。我的算法中的一些变量在我的程序之外和网页中被更改。每次用户更改网页中的变量值时,我都会修改预先创建的SQL数据库。 现在我希望我的代码在运行时更改变量值而不停止代码。有两种选择:

  1. 每隔n秒检查数据库并检索变量value - >这不好,因为我必须检查数据库内容是否每n秒更改一次(多年来可能没有任何变化。我也不想检查数据库内容是否已更改)

  2. 每次更改数据库时,我的Qt程序会发出一个信号,所以通过捕获此信号,我可以刷新变量值,这似乎是一个最佳解决方案,我想为此部分编写代码

    < / LI>

    我的代码的C ++部分是:

    void Update Database()
    {
        QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
        db.setHostName("localhost");
        db.setDatabaseName("Mydataset");
    
        db.setUserName("user");
        db.setPassword("pass");
    
        if(!db.open())
        {
            qDebug()<<"Error is: "<<db.lastError();
            qFatal("Failed To Connect");
        }
        QSqlQuery qry;
        qry.exec("SELECT * from tblsystemoptions");
        QSqlRecord rec = qry.record();
        int cols = rec.count();
        qry.next();
        MCH = qry.value(0).toString();  //some global variables used in other functions
        MCh = qry.value(1).toString();
        // ... this goes on ...
    
    
    }
    

2 个答案:

答案 0 :(得分:12)

QSqlDriver支持在发生特定事件时发出信号的通知。要订阅活动,只需使用QSqlDriver::subscribeToNotification( const QString & name )即可。当您订阅的事件由数据库发布时,驱动程序将发出notification()信号,您的应用程序可以采取适当的措施。

db.driver()->subscribeToNotification("someEventId");

可以从触发器或存储过程自动发布消息。消息非常轻量级:只不过是包含发生事件名称的字符串。

您可以将notification(const QString&)信号连接到您的插槽,例如:

QObject::connect(db.driver(), SIGNAL(notification(const QString&)), this, SLOT(refreshView()));

我应该注意MySQL不支持此功能,因为它没有事件发布机制。

答案 1 :(得分:2)

没有这样的事情。 Qt事件循环和数据库没有以任何方式连接。您只需获取/更改/删除/插入/ ...数据即可。选项1是您必须要做的。有很多方法可以在服务器端使用TRIGGER来启动外部脚本,但这对你没有多大帮助。