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

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

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

Скажите пожалуйста, если я повторно открою базу это же ни к каким последствиям не приведет???
Записан
dio
Гость
« Ответ #16 : Март 22, 2010, 17:01 »

Ну если только на производительности скажется при частом выполнении. Если у вас многопользовательское приложение, я все же советую разобраться почему не видны изменения, выполненные в другой сессии.
Записан
MoPDoBoPoT
Гость
« Ответ #17 : Март 22, 2010, 18:23 »

Ты, случаем, в первом соединении явно транзакцию не начинаешь?

Просто если одно соединение сделать, то когда это содинение отражает таблицу, я не могу транзакцию использовать... поэтому и пришлось два соединения использовать
Обоснуй (:
Записан
Garfild
Гость
« Ответ #18 : Март 22, 2010, 22:37 »

Ты, случаем, в первом соединении явно транзакцию не начинаешь?

Просто если одно соединение сделать, то когда это содинение отражает таблицу, я не могу транзакцию использовать... поэтому и пришлось два соединения использовать
Обоснуй (:

У меня в tableView отображается таблица из БД, и когда я пытаюсь использовать транзакцию, почему-то вылетает предупреждение

[Microsoft][Драйвер ODBC Microsoft Access]Задать атрибут сейчас нельзя  QODBC3: Unable to disable autocommit
Записан
Garfild
Гость
« Ответ #19 : Март 22, 2010, 22:44 »

А вообще,вот пытаюсь использовать два соединения без транзакции....одно соединение отображает таблицу, а другое вставляет строчку в таблицу - та же фигня. Почему-то при первом добавлении,изменения не отображаются, а при последующий добавлениях все добавленные строчки(включая и первую добавленную) отображаются.. Может я чего-то не вижу...
Вот код:
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   createConnection();
   m=new QSqlQueryModel();
   ui->tableView->setModel(m);
   refresh();
   connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(slotAdd()));
   connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(slotRefr()));
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
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("Ошибка"),tr(db.lastError().text());
       return false;
   }
   return true;
}
void MainWindow::slotRefr(){
   refresh();
}
void MainWindow::refresh(){
   QSqlDatabase db = QSqlDatabase::database();
   m->setQuery("Select * from [Account]",db);
   ui->tableView->setCurrentIndex(m->index(0,0));
}
 
bool MainWindow::add(){
   QSqlDatabase db = QSqlDatabase::database();
   {
      QSqlDatabase dbase = QSqlDatabase::cloneDatabase(db,"other");
      if(!dbase.open())
      {
         QMessageBox::critical(this,tr("Ошибка"),tr(dbase.lastError().text());
         return false;
      }
      QSqlQuery q=QSqlQuery(dbase);
      q.exec("INSERT INTO [Account](Num,Dat,Year) "
             "                  Values( 123455, "
             "                          1, "
             "                          #22/03/2010#, "
             "                          2010 )");
      if(q.lastError().isValid()){
          QMessageBox::information(this,"",q.lastError().text());
          return false;
      }
      dbase.close();
  }
   QSqlDatabase::removeDatabase("other");
   return true;
}
void MainWindow::slotAdd(){
   if(add()){
     refresh();
     QMessageBox::information(this,"","Добавилось");
   }
}
 
Записан
Garfild
Гость
« Ответ #20 : Март 23, 2010, 10:23 »

Кажется все дело в использовании cloneDatabase() для определения второго соединения
Вот нашел в Ассистенте:
Цитировать
Любые изменения, сделаные в соединении с базой данных через один объект QSqlDatabase, будут влиять на другие объекты QSqlDatabase, представляющие это же соединение. Вызовите cloneDatabase(), если вы хотите создать независимое соединение с базой данных на основе существующего.

Значит лучше сделать так
QSqlDatabase dbase = QSqlDatabase::addDatabase("QODBC","other");
dbase = QSqlDatabase(db);

Правда при закрытии dbase,основное соединение db тоже закрывается
Записан
Garfild
Гость
« Ответ #21 : Март 23, 2010, 11:00 »

А если использую
Код
C++ (Qt)
QSqlDatabase dbase = QSqlDatabase(db);
 
то транзакцию не получается использовать - вываливается предупреждение
Цитировать
[Microsoft][Драйвер ODBC Microsoft Access]Задать атрибут сейчас нельзя  QODBC3: Unable to disable autocommit
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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