Есть ли сигнал qt для изменения базы данных sql?

Я написал программу на C ++, используя qt. некоторые переменные внутри моего алгоритма изменяются вне моей программы и на веб-странице. каждый раз, когда пользователь изменяет значения переменных на веб-странице, я изменяю предварительно созданную базу данных SQL.
Теперь я хочу, чтобы мой код изменял значение переменных во время выполнения без остановки кода. есть два варианта:

1). Каждые n секунд проверяют базу данных и извлекают значение переменных -> это не хорошо, так как я должен проверять, меняется ли содержимое базы данных каждые n секунд (это может быть без изменений в течение многих лет !!!, и я не хочу проверять если содержимое базы данных изменилось)

2). каждый раз, когда база данных изменяется, моя программа 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 ...}

Я был бы рад увидеть, что является лучшим решением QT для этой проблемы …

Спасибо вам всем.

3

Решение

Там нет такой вещи. Цикл событий Qt и база данных никак не связаны. Вы только получаете / изменяете / удаляете / вставляете / … данные и все. Вариант 1 — это тот, который вам нужно сделать. Есть способы использовать TRIGGER на стороне сервера для запуска внешних скриптов, но это не очень вам поможет.

2

Другие решения

QSqlDriver поддерживает уведомления, которые испускают сигнал, когда произошло определенное событие. Чтобы подписаться на событие просто используйте QSqlDriver::subscribeToNotification( const QString & name ), Когда событие, на которое вы подписываетесь, публикуется базой данных, драйвер подает сигнал уведомления (), и ваше приложение может предпринять соответствующие действия.

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

Сообщение может быть отправлено автоматически из триггера или хранимой процедуры. Сообщение очень легкое: ничего, кроме строки, содержащей имя произошедшего события.

Вы можете подключить notification(const QString&)сигнал на ваш слот, как:

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

Я должен отметить, что эта функция не поддерживается MySQL, так как она не имеет механизма отправки событий.

12

По вопросам рекламы [email protected]