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

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

  1. Каждые n секунд проверяйте базу данных и извлекайте переменные value -> это нехорошо, так как я должен проверять, изменяется ли содержимое базы данных каждые 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 ...


}

person Community    schedule 07.04.2014    source источник


Ответы (2)


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

person OnWhenReady    schedule 07.04.2014
comment
внешний скрипт может соединиться с приложением Qt, и это может вызвать сигнал, но это довольно много работы - person ratchet freak; 07.04.2014
comment
Ага. Но вот вопрос: как его подключить? На розетку? Если сервер не находится под большой нагрузкой, а данные, которые вы пытаетесь получить, являются дешевым выбором, я бы сделал выборку по времени. Все остальное достаточно сложно. Я думаю, что OP нуждается в службе push-уведомлений ;-) - person OnWhenReady; 07.04.2014
comment
Уважаемый DOminik, возможно ли это с помощью сокетов? Я думаю, что и в php, и в qt легко общаться через сокет, не так ли? - person ; 07.04.2014
comment
Я далеко не эксперт по php, но использование сокетов только изменит проблему, потому что вам нужно постоянно подключаться к серверу, который будет уведомлять вас (например, путем записи в сокет), что что-то изменилось. Я не знаю тип приложения и ограничения, с которыми вы сталкиваетесь. Но получение, например. временная метка в таблице и сравнение ее с локальным временем вашей машины — гораздо более простая задача, чем использование сокета для связи с приложением, которое должно запускаться базами данных. Но я не знаю требований вашей задачи. У вас есть ограничения пропускной способности, сложные выборки для получения элементов...? - person OnWhenReady; 07.04.2014
comment
Нет, это просто простая таблица с кучей данных... оба этих приложения работают на одном компьютере и могут взаимодействовать друг с другом через системную оперативную память... Я слышал, что сокеты - хороший кандидат для решения моей проблемы но я ничего не знаю о его эффективности... - person ; 07.04.2014
comment
Какое второе приложение? Я думаю, я не понимаю? У вас есть два приложения, которые выполняют межпроцессное взаимодействие, и sql-сервер на одной машине? - person OnWhenReady; 07.04.2014

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

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

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

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

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

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

person Nejat    schedule 07.04.2014
comment
Честно говоря, я не знал об этом. Это на самом деле довольно круто ... большое спасибо. +1 - person OnWhenReady; 07.04.2014
comment
Mhh ... вы уверены, что QMYSQL поддерживает уведомления, потому что я не нашел никаких доказательств того, что MySQL поддерживает это. Мне просто любопытно, потому что я был удивлен, что знал об этой (если она доступна) потрясающей функции. - person OnWhenReady; 07.04.2014
comment
Хорошо... я проверил, и это не работает, так как MySQL (по крайней мере, в версии 5.5.32) не поддерживает такой механизм. Я так понимаю вы не тестировали? - person OnWhenReady; 08.04.2014
comment
Да, это недоступно для QMYSQL. Я не ориентировался на MySQL. - person Nejat; 08.04.2014
comment
Ok. Возможно, вам следует отредактировать свой ответ, поскольку он не имеет отношения к вопросу ОП, который явно нацелен на MySQL. - person OnWhenReady; 08.04.2014
comment
Кажется, только драйвер PostgreSQL поддерживает уведомления о событиях. Остальным потребуется голосование. - person user3427419; 08.04.2014