![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
AD |
![]()
Сообщение
#1
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Есть запросы вставки записи в таблицу, подобные данной:
Проверяю. ins = true. При этом в саму таблицу ничего не добавилось. Как такое возможно? Естественно, что при закрытии приложения никаких удалений не делаю.
Сообщение отредактировал AD - 28.3.2011, 11:12 |
|
|
![]() |
BRE |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
А если в программе sqlbrowser попробовать добавить запись в эту базу?
Как создается таблица ScriptLayer? |
|
|
AD |
![]()
Сообщение
#3
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
MJIbIu |
![]()
Сообщение
#4
|
Студент ![]() Группа: Участник Сообщений: 38 Регистрация: 14.4.2010 Пользователь №: 1630 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#5
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
MJIbIu |
![]()
Сообщение
#6
|
Студент ![]() Группа: Участник Сообщений: 38 Регистрация: 14.4.2010 Пользователь №: 1630 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
А попробуй как вот так query.prepare(QString("insert into nameDB.ScriptLayer(ScriptItemId, LayerNameId) values(%1, -1)").arg(id)); Что за nameDB? У меня ведь запрос-то выполняется... По какой-то причине при выходе из БД удаляется запись. Непонятно почему. query.prepare("INSERT INTO ИмяБД.ИмяТаблице VALUES (:value1,:value2);"); query.bindValue(":valut1", "значение 1"); query.bindValue(":value", "значение 2"); я делаю так Если бы у тебя запрос бы выполнялся тогда бы и в БД заносились бы данные. По какой-то причине при выходе из БД удаляется запись. ![]() Ты с какой СУБД работаешь ? |
|
|
AD |
![]()
Сообщение
#7
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
query.prepare("INSERT INTO ИмяБД.ИмяТаблице VALUES (:value1,:value2);"); query.bindValue(":valut1", "значение 1"); query.bindValue(":value", "значение 2"); я делаю так Если бы у тебя запрос бы выполнялся тогда бы и в БД заносились бы данные. При добавлении я вижу, что в таблице появилась новая запись, значит, все же, добавилась. На счет ИмяДБ хотел уточнить. Я правильно понимаю, что имеется в виду имя соединения или же имеется в виду имя следующее - QSqlDatabase::database("connectionName").databaseName(); ![]() Ты с какой СУБД работаешь ? SQLiteAdmin в качестве СУБД. http://sqliteadmin.orbmu2k.de/ Сообщение отредактировал AD - 28.3.2011, 16:37 |
|
|
MJIbIu |
![]()
Сообщение
#8
|
Студент ![]() Группа: Участник Сообщений: 38 Регистрация: 14.4.2010 Пользователь №: 1630 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
При добавлении я вижу, что в таблице появилась новая запись, значит, все же, добавилась. На счет ИмяДБ хотел уточнить. Я правильно понимаю, что имеется в виду имя соединения или же имеется в виду имя следующее - QSqlDatabase::database("connectionName").databaseName(); ![]() Ты с какой СУБД работаешь ? SQLiteAdmin в качестве СУБД. http://sqliteadmin.orbmu2k.de/ create database ИмяБД character set utf8; вот что я имел виду если у тебя создается тогда это не важно Важнее то что у тебя после выхода твоей проги не сохраняются данные. Выложи полный код. И покопайся в СУБД мб она как то настроено хитро всяко бывает http://www.mysql.ru/docs/gruber/mg23.html КОГДА СДЕЛАННЫЕ ИЗМЕНЕНИЯ СТАНОВЯТСЯ ПОСТОЯННЫМИ Смахивает на твою проблему Сообщение отредактировал MJIbIu - 28.3.2011, 16:59 |
|
|
AD |
![]()
Сообщение
#9
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
http://www.mysql.ru/docs/gruber/mg23.html КОГДА СДЕЛАННЫЕ ИЗМЕНЕНИЯ СТАНОВЯТСЯ ПОСТОЯННЫМИ Смахивает на твою проблему Да. Похоже на данную проблему. Как это в СУБД решить, пока не нашел.
res = true, res_commit = false; И в БД не попадает при выходе из приложения. В err данном случае попадает следующая фраза Цитата cannot commit transaction - SQL statements in progress Unable to fetch row Данный код тоже выдает сообщение предупреждение
Цитата cannot commit transaction - SQL statements in progress Unable to commit transaction. Есть варианты как сделать? Копаюсь в ассистенте. Пока ничего не нашел.
|
|
|
AD |
![]()
Сообщение
#10
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Буду рад, если поможете. Не понимаю, как сделать правильный commit транзакции. Возвращает ошибку, указанную в предыдущем посте. Повторюсь, что это необходимо, чтобы БД приняла данные, т.е. чтобы данные сохранились в БД. На данный момент получается такая фигня, что я вижу добавленные данные во время работы приложения. Но как только я перезапускаю приложение, данных нет. Сделать так, чтобы commit в итоге стал true не получается....
|
|
|
AD |
![]()
Сообщение
#11
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Неужели ни у кого не было подобной проблемы при работе с SQLite?
|
|
|
MJIbIu |
![]()
Сообщение
#12
|
Студент ![]() Группа: Участник Сообщений: 38 Регистрация: 14.4.2010 Пользователь №: 1630 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Буду рад, если поможете. Не понимаю, как сделать правильный commit транзакции. Возвращает ошибку, указанную в предыдущем посте. Повторюсь, что это необходимо, чтобы БД приняла данные, т.е. чтобы данные сохранились в БД. На данный момент получается такая фигня, что я вижу добавленные данные во время работы приложения. Но как только я перезапускаю приложение, данных нет. Сделать так, чтобы commit в итоге стал true не получается.... bool QSqlDatabase::commit () Выполняет транзакцию в базу данных, если она поддерживается драйвером и уже была начата транзакция посредством transaction(). Возвращает true в случае успеха операции. В противном случае возвращает false. Замечание: Для некоторых баз данных фиксация транзакции завершится неудачно и возвратит false, если использовалась active query базы данных для SELECT. Сделайте запрос inactive перед выполнением фиксации транзакции. http://www.javatalks.ru/ntopic9646.php конечно там на java ну смысл я думаю тот же |
|
|
AD |
![]()
Сообщение
#13
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
bool QSqlDatabase::commit () Выполняет транзакцию в базу данных, если она поддерживается драйвером и уже была начата транзакция посредством transaction(). Возвращает true в случае успеха операции. В противном случае возвращает false. Замечание: Для некоторых баз данных фиксация транзакции завершится неудачно и возвратит false, если использовалась active query базы данных для SELECT. Сделайте запрос inactive перед выполнением фиксации транзакции. http://www.javatalks.ru/ntopic9646.php конечно там на java ну смысл я думаю тот же Я умею читать ассистент. setAutocommit - в Qt нет. Сделал для запроса clear(), не прокатило. Что еще возможно? Данную ссылку уже сам находил - не помогло. Запрос делаю неактивным, но в БД запись не попадает. Сообщение отредактировал AD - 31.3.2011, 11:37 |
|
|
AD |
![]()
Сообщение
#14
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Вернулся к СУБД Paradox. Решение на данную проблему найти не смог. Буду пробовать ускорять работу запросов в Paradox
|
|
|
AD |
![]()
Сообщение
#15
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
В связи с тем, что скорость работы на Paradox маленькая, перешел обратно на SQLite. Проблема осталась. Не удается внести и запомнить записи. При транзакции коммит не удается сделать.
Выдает следующее сообщение Цитата cannot commit transaction - SQL statements in progress Unable to commit transaction Самое странное, что записи из файла он в таблицу вставил нормально. Кто может помочь с этой проблемой. Уже несколько дней мучаюсь, решить не получается. Буду благодарен за помощь. Вот функция, в которой транзакция не выполняется. Раскрывающийся текст
Сообщение отредактировал AD - 11.4.2011, 9:27 |
|
|
MoPDoBoPoT |
![]()
Сообщение
#16
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(QtAssistant) bool QSqlQuery::isActive () const ... Note: Of particular interest is an active query that is a SELECT statement. For some databases that support transactions, an active query that is a SELECT statement can cause a commit() or a rollback() to fail, so before committing or rolling back, you should make your active SELECT statement query inactive using one of the ways listed above. Попробуй перед фиксацией транзакции для всех активных запросах вызвать clear() |
|
|
AD |
![]()
Сообщение
#17
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#18
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
В результате долгих копаний. Кое-что смог выяснить. Исходя из этой статьи, выяснил, что БД SQLite может хранится в памяти, а может в файле. Вопрос. Как организовать правильное хранение в памяти? Т.е. что конкретно надо поменять в данном коде:
Куда это ":in_memory:" добавить? Ну и попутный вопрос к ViGOur: помнится где-то была статья и сборке плагина без сборки всего Qt. Дайте, пожалуйста, ссылку на эту статью. Заранее спасибо. |
|
|
MoPDoBoPoT |
![]()
Сообщение
#19
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#20
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#21
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Либо я чего-то не понял, либо еще что-то, но загружать БД в память, а потом сохранять в файл не получилось. Прошу, кто может помочь, помогите, пожалуйста. Очень необходимо поправить глюк с транзакциями. Я не понимаю в чем ошибка...
|
|
|
MoPDoBoPoT |
![]()
Сообщение
#22
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
Либо я чего-то не понял, либо еще что-то, но загружать БД в память, а потом сохранять в файл не получилось. Если только приаттачить (ATTACH DATABASE) файл БД, после чего переписать туда данные. Но лучше разобраться с проблемой транзакций и писать сразу в файл. Мне кажется, можно попробовать создать отдельное соединение для изменения данных в БД, чтобы не искать активные запросы и сбрасывать их. |
|
|
AD |
![]()
Сообщение
#23
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Если только приаттачить (ATTACH DATABASE) файл БД, после чего переписать туда данные. Но лучше разобраться с проблемой транзакций и писать сразу в файл. Мне кажется, можно попробовать создать отдельное соединение для изменения данных в БД, чтобы не искать активные запросы и сбрасывать их. Сделал новое соединение, специально, чтобы делать выборки и вставки в БД. В итоге получил следующую ошибку при транзакции: Цитата database is locked Unable to commit transaction Как решить эту проблему? |
|
|
MoPDoBoPoT |
![]()
Сообщение
#24
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
Странно. Блокировку можно получить, когда в рамках разных транзакций происходит попытка изменения БД, но у тебя же одно подключение читает, а другое пишет... Может ещё быть из-за уровня изоляции транзакции EXCLUSIVE, но я не думаю, что ты его указывал.
|
|
|
AD |
![]()
Сообщение
#25
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Странно. Блокировку можно получить, когда в рамках разных транзакций происходит попытка изменения БД, но у тебя же одно подключение читает, а другое пишет... Может ещё быть из-за уровня изоляции транзакции EXCLUSIVE, но я не думаю, что ты его указывал. Тоже считаю, что странно. Но пока ничего не выходит. А проблему очень надо решить. Буду безумно благодарен, если сможешь помочь. Никаких EXCLUSIVE не использовал. |
|
|
AD |
![]()
Сообщение
#26
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
О. Все-таки каких-то результатов удалось добиться. Смысл в том, что модель, унаследованная от QSqlTableModel блокирует базу данных, в результате чего возникают данные ошибки. Попробую разобраться в этом, тем более, что я видел, что QSqlLite как-то странно работает с моделями. Об этом я видел в ассистенте сообщение.
|
|
|
AD |
![]()
Сообщение
#27
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Проблема решена. Дело вот в чем. Моя модель SqlFileModel наследовалась от QSqlTableModel, а у QSqlTableModel есть особенность при работе с SQLite она блокирует БД, пока не выполняться все ее select-запросы, что мне изрядно мешало.
Решение состоит в том, что модель стал наследовать от QAbstractTableModel. Тогда все вставки в таблицу происходят без проблем. |
|
|
MoPDoBoPoT |
![]()
Сообщение
#28
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#29
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 18.7.2025, 10:40 |