Здравствуйте, гость ( Вход | Регистрация )
Litkevich Yuriy | Дата 3.6.2013, 18:49 |
так надо использовать QSqlQuery? Или QSqlQueryModel тоже можно? ошибся, QSqlQuery конечноА что вы думаете о предложении lvlad ? надо пробовать, решение не очевидное. |
|
Steklova Olga | Дата 3.6.2013, 10:36 |
Транзакции уверенно работают только при использовании QSqlQueryModel и всё. Как только начинают использоваться QSqlTableModel так всё сразу начинает глючить. а ранее вы писали Заменил QSqlTableModel, на простой QSqlQuery Простите, так надо использовать QSqlQuery? Или QSqlQueryModel тоже можно? А что вы думаете о предложении lvlad ? чтобы исправить проблему необходимо в файле qsqltablemodel.cpp в методе QSqlTableModelPrivate::exec закомментировать строку:
После этого придется перекомпилировать Qt или модуль QtSql |
|
Litkevich Yuriy | Дата 31.5.2013, 19:33 |
"The database reported an error: invalid transaction handle (expecting explicit transaction start) Unable to execute query", вторая запись не сохраняется. Это всё к тому что я написал выше, тут вот ещё кое-чтов общем ни модели Qt ни соответственно Мапер (который пользуется моделью) не подразумевают использование транзакций. Транзакции уверенно работают только при использовании QSqlQueryModel и всё. Как только начинают использоваться QSqlTableModel так всё сразу начинает глючить. Причём проявляется это для разных драйверов СУБД. На сегодняшний день проявилось (в разных версиях Qt по разному) QIBase/QFirebird, QSqlite, QMysql, QOdbc |
|
Steklova Olga | Дата 31.5.2013, 17:52 |
Начала проверять разные ветки алгоритма работы оператора в этом примере у Земскова. Мне кажется, некоторые ветки не доделаны. Вы про это говорили, Юрий? Смотрите, делаю так: Запускаю пример, "Новая строка", Номер = 1, Имя = 1, перевожу фокус на Номер, кнопку "Записать" НЕ НАЖИМАЮ, "Новая строка", Номер = 2, Имя = 2, перевожу фокус на Номер, НАЖИМАЮ кнопку "Записать" - все ОК, в таблице сохранились две новые записи, закрываю программу. Запускаю пример, "Новая строка", Номер = 3, Имя = 3, перевожу фокус на Номер, НАЖИМАЮ кнопку "Записать" - все ОК, в таблице сохранилась одна новая запись, "Новая строка", Номер = 3, Имя = 4, перевожу фокус на Номер, НАЖИМАЮ кнопку "Записать" - получаю сообщение: "The database reported an error: invalid transaction handle (expecting explicit transaction start) Unable to execute query", вторая запись не сохраняется. Такой с виду пример хороший, так и хочется списать, подкрутив кое-что. Может кто сказать, как довести этот пример до ума? Что ж мне делать? Как мне быть? Как задачку мне решить? |
|
Steklova Olga | Дата 31.5.2013, 17:02 |
можно было создать домен, а остальное оставить как есть. домен-то создать было можно, но такой запрос создания таблицы все равно бы не прошелв примере в SQL команде CREATE TABLE указано NULL для некоторых полей, а в FireBird такого нет. В FireBird есть [DEFAULT {<литерал> | NULL}] и [NOT NULL] формат SQL команды CREATE TABLE в FireBird А что имеется в виду в примере, когда пишется NULL: DEFAULT NULL словами FireBird'а или то, что поле может принимать значение NULL? |
|
Litkevich Yuriy | Дата 31.5.2013, 16:13 |
из-за того, что в FireBird нет типа boolean в Firebird есть домены (пользовательские типы данных), можно было создать домен, а остальное оставить как есть. |
|
Steklova Olga | Дата 31.5.2013, 15:50 |
Поменяла для себя в коде примера драйвер на QIBASE, так как работаю с FireBird 2.1. Пустую БД создала в IBExpert, а таблицы и данные для них добавила с помощью примера chap17/db00, подправив запрос создания таблицы (из-за того, что в FireBird нет типа boolean). |
|
Steklova Olga | Дата 31.5.2013, 15:18 |
а как настроены модель и Мапер (режим)? в примере в книге так:
|
|
Litkevich Yuriy | Дата 31.5.2013, 15:09 |
Steklova Olga, а как настроены модель и Мапер (режим)? MyModel *m = qobject_cast<MyModel *>(model()); к стати, это приведение излишне, т.к. методы модели, используемые в этой функции, объявлены в базовом классе модели. |
|
Steklova Olga | Дата 31.5.2013, 14:08 |
Там вроде ещё Tab также обрабатывается. нетЗапустила пример, Tab не помогает при корректировки таблицы БД прямо в TableView. Зато, при корректировке таблицы БД через QDataWidgetMapper помогает смена фокуса на другой контрол маппера с помощью Tab или курсора, а Enter в этом случае не подходит. Ещё нюанс: при использовании Мапера становится невозможным использовать транзакции. Например, ты запускаешь транзакцию, пользователь взаимодействует с Мапером через виджеты, затем (по кнопке) фиксируешь трнзакцию. Фиксация при редактировании нескольких строк таблицы завершится неудачей. Т.к. в драйверах БД что-то идёт криво и ID транзакции используется неверный. Почему вы говорите, что нельзя использовать транзакции? Может, я неверно поняла, что вы этим хотите сказать, о какой транзакции идет речь?В примере chap18/db04 из книги Земскова "Qt4 на примерах" есть такой код: Тут есть транзакция. Запускаю пример, редактирую одну запись таблицы БД в маппере, завершаю корректировку сменой фокуса с последнего откорректиррованного контрола на другой, затем аналогично редактирую другую запись, только после этого нажимаю кнопку "записать". И все срабатывает, все изменения обеих записей сохраняются в таблице БД. А вы о чем говорили? |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 3.12.2024, 5:05 |