Russian Qt Forum
Сентябрь 30, 2024, 16:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Два соединения к базе данных  (Прочитано 13281 раз)
Garfild
Гость
« : Март 18, 2010, 15:47 »

Есть два соединения с базой данных. Одно соединение отображает таблицу БД(1-е соединение), а другое соединение(2-е соединение) копирует одну из строчек таблицы... После копирования, хочу чтобы таблица обновлялась... но вот иногда когда я обращаюсь к 1-му подключению,данные в таблице отображаются старые..т.е. без изменений,которые были сделаны 2-м подключением ... как же можно обновить это 1-е подключение??
Записан
cya-st
Гость
« Ответ #1 : Март 18, 2010, 16:19 »

Сделай в проге одно соединение.
Записан
Garfild
Гость
« Ответ #2 : Март 18, 2010, 16:22 »

Просто если одно соединение сделать, то когда это содинение отражает таблицу, я не могу транзакцию использовать... поэтому и пришлось два соединения использовать
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Март 18, 2010, 16:46 »

данные в представлении обновляются при изменении модели. Попробуй по завершению копирования делать для неё select()
Записан

Юра.
dio
Гость
« Ответ #4 : Март 18, 2010, 16:51 »

Делаете ли вы commit во 2-м соединении?
Ну и хорошо бы рассказать: какую БД используете, как устанавливаете соединение, как делаете запрос данных, как модифицируете данные.
Записан
Garfild
Гость
« Ответ #5 : Март 18, 2010, 17:01 »

В том-то и дело... я после завершения копирования для модели делаю setQuery()...и вот что заметил, после того как первый раз скопирую данные не обновляються даже после вызова setQuery()... а потом все нормально... только после второго вызова появляется сразу две новых строчки(т.е. еще та строчка,которая не появилась после первого вызова), а потом все как-надо. Хотя первый раз setQuery вызывается -  проверено
Записан
Garfild
Гость
« Ответ #6 : Март 18, 2010, 17:03 »

В том-то и дело... я после завершения копирования для модели делаю setQuery()...и вот что заметил, после того как первый раз скопирую данные не обновляються даже после вызова setQuery()... а потом все нормально... только после второго вызова появляется сразу две новых строчки(т.е. еще та строчка,которая не появилась после первого вызова), а потом все как-надо. Хотя первый раз setQuery вызывается -  проверено

щас тока домой приду и расскажу  Улыбающийся
Записан
Garfild
Гость
« Ответ #7 : Март 18, 2010, 18:16 »

Использую Access.
При вызове программка сразу же подклюсается к БД
Код
C++ (Qt)
bool MainWindow::createConnection()
{
   QDir dir("data");
   QString fileName = dir.absolutePath().replace("/","\\") + "\\accounts.mdb";
   db = QSqlDatabase::addDatabase("QODBC");
   db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=" + fileName);
   if(!db.open())
   {
       QMessageBox::critical(this,tr("Ошибка"),db.lastError().text());
       return false;
   }
   return true;
}
 
при копировании делаю так
Код
C++ (Qt)
bool copy(int rf_IDSmetiCopy){
QSqlDatabase db = QSqlDatabase::database();
   {
     QSqlDatabase dbase = QSqlDatabase::cloneDatabase(db,"other");
     if(!dbase.open())
     {
         QMessageBox::critical(this,tr("Ошибка"),dbase.lastError().text());
         return false;
     }
 
     dbase.transaction();
 
     QSqlQuery query(dbase);
 
     if(!query.exec(tr("INSERT ..."))
     {
         QMessageBox::critical(this,tr("Ошибка SQL"),query.lastError().text());
         dbase.rollback();
         return false;
     }
 
     query.clear();
     query.exec("INSERT");
     if(query.lastError().isValid()){
         QMessageBox::critical(this,tr("Ошибка SQL"),query.lastError().text());
         dbase.rollback();
         return false;
     }
     emit copyEndTabl();
 
   //i t.d.
 
     dbase.commit();
     dbase.close();
   }
   QSqlDatabase::removeDatabase("other");
   return true;
}
 
ну и обновляю данные потом с помощью setQuery()
Записан
cya-st
Гость
« Ответ #8 : Март 18, 2010, 18:39 »

Цитировать
()...и вот что заметил, после того как первый раз скопирую данные не обновляються даже после вызова setQuery()... а потом все нормально... только после второго вызова появляется сразу две новых строчки(т.е. еще та строчка,которая не появилась после первого вызова)
в таблице не обновляется?
Записан
cya-st
Гость
« Ответ #9 : Март 18, 2010, 20:25 »

или вывод в QTableView или куда нибудь еще?
Записан
Garfild
Гость
« Ответ #10 : Март 18, 2010, 20:48 »

Цитировать
()...и вот что заметил, после того как первый раз скопирую данные не обновляються даже после вызова setQuery()... а потом все нормально... только после второго вызова появляется сразу две новых строчки(т.е. еще та строчка,которая не появилась после первого вызова)
в таблице не обновляется?

Просто при вызове model->setQuery() основного соединения, почему-то не всегда отображается данные вставленные с помощью 2-го соединения...то отображаются,а то нет... не пойму от чего это зависит
Записан
dio
Гость
« Ответ #11 : Март 19, 2010, 09:48 »

Вы обновляете данные при обработке сигнала copyEndTabl или после выполнения метода copy?
Записан
Garfild
Гость
« Ответ #12 : Март 19, 2010, 10:14 »

обновляю данные после метода copy.. т.е. к тому моменту второе соединение у меня уже закрыто. И такое ощущение, что в первои соединении еще не отразились изменения, которые произошли во втором.
...то отображаются,а то нет... не пойму от чего это зависит
Записан
dio
Гость
« Ответ #13 : Март 19, 2010, 11:11 »

Если есть возможность, погоняйте свой код с другой многопользовательской БД. Вполне возможно, что дело в Access'e.
Записан
Garfild
Гость
« Ответ #14 : Март 22, 2010, 09:06 »

Если перед обновлением таблицы,т.е. методом setQuery() повторно открыть БД (1-е соединение), т.е. сделать
Код
C++ (Qt)
QSqlDatabase db = QSqlDatabase::database();
db.open();
 
то все нормально обновляется. Только насколько это корректно??? Получается мы БД открываем два раза
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.22 секунд. Запросов: 23.