Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: БД сохранение и закрытие
Форум на CrossPlatform.RU > Разработка > SQL. Базы данных.
Stoptyssin
Всем здраствуйте. Суть проблемы: есть база данных из нескольких таблиц, таблицы отображаются через QTableModel и QTableView. Находятся на разных формах, на главной форме есть основная таблица, в которую заносится вся информация с остальных (через вторичные ключи от остальных таблиц). После выполнения запроса- вставки новой инфы в основную таблицу, необходимо сохранить данные и обновить эту таблицу. Пытался вот так:

if(Gmodel->submitAll())
        {
           Gmodel->database().commit();
         }
        else
        {
            Gmodel->database().rollback();
            QMessageBox::warning(this, "", "CloseEvent!", QMessageBox::Yes | QMessageBox::No);
        }

Не получилось вывел следующее:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.

Добавил следующий код в деструктор главной формы:

    QSqlDatabase db = QSqlDatabase::database();
         if (db.isOpen())
         {
             db.close();
             db.removeDatabase(db.connectionName());

        }

Выводит тоже самое, и информация в БД не сохраняется.
Я уже заколебался, просмотрел примеры и кучу форумов посвященных данной проблеме. Заранее спасибо...
Litkevich Yuriy
1) в первом фрагменте года я не вижу где у тебя транзакция начинается (прежде чем фиксировать или откатывать, её нужно запустить).
вывод указанного сообщения об ошибке не возможен, т.к. в приведённом фрагменте кода нет удаления соединения, видимо ты получаешь это сообщение от второго фрагмента кода.

2) Удалять соединение нужно в соответствии с документацией
Stoptyssin
Цитата(Litkevich Yuriy @ 18.3.2012, 14:55) *
1) в первом фрагменте года я не вижу где у тебя транзакция начинается (прежде чем фиксировать или откатывать, её нужно запустить).
вывод указанного сообщения об ошибке не возможен, т.к. в приведённом фрагменте кода нет удаления соединения, видимо ты получаешь это сообщение от второго фрагмента кода.

2) Удалять соединение нужно в соответствии с документацией


C первым я вроде разобрался, вроде моя СУБД не поддерживает транзкаций))) - во я ламер. Со вторым, я вроде так и делаю, т.к удаляю соединение в деструкторе главной формы)))
Litkevich Yuriy
Цитата(Stoptyssin @ 18.3.2012, 19:03) *
т.к удаляю соединение в деструкторе главной формы)))
причём здесь деструктор?
смотри ещё раз внимательно ссылку, в чём принципиальная разница между двумя приведёнными примерами в документации?
Stoptyssin
Цитата(Litkevich Yuriy @ 18.3.2012, 23:24) *
Цитата(Stoptyssin @ 18.3.2012, 19:03) *
т.к удаляю соединение в деструкторе главной формы)))
причём здесь деструктор?
смотри ещё раз внимательно ссылку, в чём принципиальная разница между двумя приведёнными примерами в документации?


Я так понял , в первом случае команда QSqlDatabase::removeDatabase("sales"); выполняется в одном блоке с запросом. А во втором отдельно после блока соединения и запроса, так? Но деструктор выполняется полюбому после блоков соединения БД и запросов?
Litkevich Yuriy
Цитата(Stoptyssin @ 19.3.2012, 21:17) *
команда QSqlDatabase::removeDatabase("sales");
Важно:
не команда, а функция, мало того в примере используется прямой вызов статической функции
Цитата(Stoptyssin @ 19.3.2012, 21:17) *
выполняется в одном блоке с запросом.
не только с запросом! С чем ещё?


В документации в комментарии ко второму коду подсказка
Stoptyssin
Все дошло))) спасибо. Но вот возник еще один вопрос. Мне надо создать таблицу в программе имя которой будет строковой переменной.
Я создаю так:

query.exec("create table ' " + str + " (id integer PRUMARY KEY, value integer)' ")

просто не могу правильно составить запрос, потому что если так

query.exec("create table name_table (id integer PRUMARY KEY, value integer) ");
то таблица создается...
Iron Bug
Цитата(Stoptyssin @ 19.3.2012, 23:08) *
просто не могу правильно составить запрос

кавычки в запросе лишние убери. и не PRUMARY, а PRIMARY.

Stoptyssin
Цитата(Iron Bug @ 20.3.2012, 10:38) *
Цитата(Stoptyssin @ 19.3.2012, 23:08) *
просто не могу правильно составить запрос

кавычки в запросе лишние убери. и не PRUMARY, а PRIMARY.


А какие именно, если обинарные - убирал, не помогает(((

Цитата(Stoptyssin @ 20.3.2012, 17:36) *
Цитата(Iron Bug @ 20.3.2012, 10:38) *
Цитата(Stoptyssin @ 19.3.2012, 23:08) *
просто не могу правильно составить запрос

кавычки в запросе лишние убери. и не PRUMARY, а PRIMARY.


А какие именно, если обинарные - убирал, не помогает(((


одинарные
Iron Bug
одинарные, понятное дело. их там даже две, зачем - совершенно непонятно. и проверь, что у тебя в str хранится.
Stoptyssin
Цитата(Iron Bug @ 20.3.2012, 22:38) *
одинарные, понятное дело. их там даже две, зачем - совершенно непонятно. и проверь, что у тебя в str хранится.


в str все правильно храниться, а про одинарные кавычки посмотрел где-то на форумах, для чего сам не понял, - подумал может поможет. Разобрался с этим вопросом так создал перемнную типа QString? сначала ей присвоил запорс, а потом выполнил ее в .exec(). Все большушее спасиб)))
Iron Bug
а про строки в С++ и SQL ты всё-таки почитай. там ничего сложного нет. в программировании нельзя применять то, что "сам не понял" :)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.