Всем доброго времени суток!
Задача такая: есть приложение, нужно отделить графическую часть от части обновления данных, соответственно все что работает с БД, вынес в отдельный поток....но тут столкнулся с такими граблями - Есть 1 запрос который просто выдергивает данные, есть 2 запрос который обновляет табличку методом Update...собственно проблема такая, выдернул данные, обновил, снова выдергиваю и запрос возвращает старые данные, которые были до изменения....снова обновляю, опять запрашиваю и вижу что выводиться операция с обновленными данными на 1 шаге....и так все время, идет задержка в 1 шаг....при этом смотрю в PLSQL Developer'e там все отлично...может кто сталкивался...
вот пример кода для работы с БД:
// сам класс потока
class DBThread: public QThread {
public:
DBThread(QObject *parent = 0);
void run();
void setDataToParking();
void setOvertakeAircraft(int idMcWith, int idMcOn, int idBoardFlight);
QSqlDatabase db;
};
// реализация класса
void DBThread::run() //создание подключения к БД
{
Config config; // читалка настроек подключения
db = QSqlDatabase::addDatabase("QOCI"); // подгружаю драйвер осси
db.setUserName(config.getUser());
db.setPassword(config.getPassword());
db.setHostName(config.getHost());
db.setDatabaseName(config.getDB());
if (!db.open()){
qDebug() << "Not open DB: " << db.lastError();
} else qDebug() << "Open DB OK!";
exec();
qDebug() << "DBThread exec";
}
void DBThread::setOvertakeAircraft(int idMcWith, int idMcOn, int idBoardFlight)
{
QSqlDatabase db = QSqlDatabase::database();
QSqlQuery query(db);
query.prepare("BEGIN spp.mc_core.buksir(:1, :2, :3, :4); END;"); // таким образом изменяю данные
query.bindValue(":1", idMcWith);
query.bindValue(":2", idMcOn);
query.bindValue(":3", idBoardFlight);
query.bindValue(":4", 0, QSql::Out);
if (query.exec()){
int i = query.boundValue(":4").toInt();
qDebug() << "Set ok: " << i;
} else qDebug() << "Set error: " << query.lastError().text();
setDataToParking(); // обнавляю данные после их изменения
}
void DBThread::setDataToParking()
{
QSqlDatabase db = QSqlDatabase::database();
QSqlQuery query(db);
query.prepare("select * from table(get_fltime_mc) "); // запрос данных из БД
query.exec();
while(query.next()){
qDebug() << query.value(query.record().indexOf("MC_STATUS")).toString(); // вывожу значение которое меняется
}
}
// вызов потока из графической части
MyForm::MyForm() : ui(new Ui::MyForm)
{
DBThread *dbThread = new DBThread(/*dc->getGraphicsItemArray(),*/);
dbThread->start();
}
Ах да, Qt 4.7, Win7 Ultimate, БД Oracle
Уже переделал что бы это был не поток, а обычный класс, все равно работает так же криво....