crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> SQLITE. Два подключения к базе
berserk
  опции профиля:
сообщение 22.4.2014, 12:39
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 9.2.2009
Пользователь №: 540

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет!
Есть БД на SQLITE, лежит на ntfs, OS Windows. Заметил струнную вещь.
Если мною написанную программу запустить 2 раза, то писать в любую таблицу базы может только первая. Второй экземпляр программы создаёт журнал, но накатить его не может.
Вроде бы логично. NTFS - блокировки...
Но те же действия работают в Sqliteman. Т.е. Если его запустить его 2 раза и подключить один файл базы, то можно поочерёдно писать в одну и туже таблицу.
Хотя первый экземпляр так же блокирует базу.

Либо я что то не то написал в своей программе, либо у sqliteman хитрый способ какой то.
Кто знает объясните...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.4.2014, 13:15
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


телепатов нет. кода никто не видел.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
berserk
  опции профиля:
сообщение 22.4.2014, 14:10
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 9.2.2009
Пользователь №: 540

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 22.4.2014, 14:15) *
телепатов нет. кода никто не видел.


Запускаю программу...

Открываю соединение с базой
db = new QSqlDatabase;
*db = QSqlDatabase::addDatabase("QSQLITE");
    db->setDatabaseName(QApplication::applicationDirPath()+"/database.db");
    if (!db->open())
    {
        QString error_db = db->lastError().text();
        QMessageBox::critical(this, "error", error_db);
        db->close();
        exit(1);
        return false;
    }
query = new QSqlQuery;


Гдето в коде


query->prepare("INSERT INTO firm (id, value)"
                            "VALUES (?, ?)");
    query->addBindValue(ui->lineEdit_id->text());
    query->addBindValue(ui->lineEdit_value->text());
    query->exec();
    query->clear();


Перед закрытием программы
db->close();


как то так.

Сообщение отредактировал berserk - 22.4.2014, 14:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.4.2014, 20:48
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


я подозреваю, что надо сессию открывать с BEGIN IMMEDIATE, но как это делается в Qt подсказать не могу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_berserk_*_*
сообщение 22.4.2014, 21:04
Сообщение #5





Гости








    


Цитата(Iron Bug @ 22.4.2014, 20:48) *
я подозреваю, что надо сессию открывать с BEGIN IMMEDIATE, но как это делается в Qt подсказать не могу.


Щас погугим...
блин, а в linux всё ок.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
berserk
  опции профиля:
сообщение 22.4.2014, 23:12
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 9.2.2009
Пользователь №: 540

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Гость_berserk_* @ 22.4.2014, 22:04) *
Цитата(Iron Bug @ 22.4.2014, 20:48) *
я подозреваю, что надо сессию открывать с BEGIN IMMEDIATE, но как это делается в Qt подсказать не могу.


Щас погугим...
блин, а в linux всё ок.


Спасибо! Всё получилось.

Все запросы с записью в БД заключил в

query->exec("BEGIN IMMEDIATE TRANSACTION");

//запросы

query->exec("COMMIT");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 16:59