Версия для печати темы
Форум на 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)