Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ SQL. Базы данных. _ БД сохранение и закрытие

Автор: Stoptyssin 14.3.2012, 21:10

Всем здраствуйте. Суть проблемы: есть база данных из нескольких таблиц, таблицы отображаются через 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 18.3.2012, 11:55

1) в первом фрагменте года я не вижу где у тебя транзакция начинается (прежде чем фиксировать или откатывать, её нужно запустить).
вывод указанного сообщения об ошибке не возможен, т.к. в приведённом фрагменте кода нет удаления соединения, видимо ты получаешь это сообщение от второго фрагмента кода.

2) Удалять соединение нужно http://doc.crossplatform.ru/qt/4.7.x/html-qt/qsqldatabase.html#removeDatabase

Автор: Stoptyssin 18.3.2012, 17:03

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

2) Удалять соединение нужно http://doc.crossplatform.ru/qt/4.7.x/html-qt/qsqldatabase.html#removeDatabase


C первым я вроде разобрался, вроде моя СУБД не поддерживает транзкаций))) - во я ламер. Со вторым, я вроде так и делаю, т.к удаляю соединение в деструкторе главной формы)))

Автор: Litkevich Yuriy 18.3.2012, 20:24

Цитата(Stoptyssin @ 18.3.2012, 19:03) *
т.к удаляю соединение в деструкторе главной формы)))
причём здесь деструктор?
смотри ещё раз внимательно ссылку, в чём принципиальная разница между двумя приведёнными примерами в документации?

Автор: Stoptyssin 19.3.2012, 19:17

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


Я так понял , в первом случае команда QSqlDatabase::removeDatabase("sales"); выполняется в одном блоке с запросом. А во втором отдельно после блока соединения и запроса, так? Но деструктор выполняется полюбому после блоков соединения БД и запросов?

Автор: Litkevich Yuriy 19.3.2012, 19:33

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


В документации в комментарии ко второму коду подсказка

Автор: Stoptyssin 19.3.2012, 20:08

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

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 20.3.2012, 7:38

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

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


Автор: Stoptyssin 20.3.2012, 14:56

Цитата(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 20.3.2012, 19:38

одинарные, понятное дело. их там даже две, зачем - совершенно непонятно. и проверь, что у тебя в str хранится.

Автор: Stoptyssin 25.3.2012, 17:27

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


в str все правильно храниться, а про одинарные кавычки посмотрел где-то на форумах, для чего сам не понял, - подумал может поможет. Разобрался с этим вопросом так создал перемнную типа QString? сначала ей присвоил запорс, а потом выполнил ее в .exec(). Все большушее спасиб)))

Автор: Iron Bug 25.3.2012, 20:16

а про строки в С++ и SQL ты всё-таки почитай. там ничего сложного нет. в программировании нельзя применять то, что "сам не понял" :)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)