3 c++ sql qt change-notification qsqldatabase
我用Qt编写了一个C++程序.我的算法中的一些变量在我的程序之外和网页中被更改.每次用户更改网页中的变量值时,我都会修改预先创建的SQL数据库.现在我希望我的代码在运行时更改变量值而不停止代码.有两种选择:
每隔n秒检查数据库并检索变量value- >这不好,因为我必须检查数据库内容是否每n秒更改一次(多年来可能没有任何变化.另外我不想检查数据库内容已更改)
每次更改数据库时,我的Qt程序都会发出一个信号,所以通过捕获此信号,我可以刷新变量值,这似乎是一个最佳解决方案,我想为此部分编写代码
我的代码的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 ...
}
Run Code Online (Sandbox Code Playgroud)
Nej*_*jat 12
QSqlDriver支持在发生特定事件时发出信号的通知.订阅活动只需使用QSqlDriver::subscribeToNotification( const QString & name ).当您订阅的事件由数据库发布时,驱动程序将发出notification()信号,您的应用程序可以采取适当的措施.
db.driver()->subscribeToNotification("someEventId");
Run Code Online (Sandbox Code Playgroud)
消息可以从触发器或存储过程自动发布.消息非常轻量级:只不过是包含发生的事件名称的字符串.
您可以将notification(const QString&)信号连接到插槽,如:
QObject::connect(db.driver(), SIGNAL(notification(const QString&)), this, SLOT(refreshView()));
Run Code Online (Sandbox Code Playgroud)
我应该注意MySQL不支持此功能,因为它没有事件发布机制.