crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Вопросы по примеру staffmanager из книги Бланшет "Qt 4. Программирование GUI на C++"
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 3.6.2013, 18:49
 
Цитата(Steklova Olga @ 3.6.2013, 12:36) *
так надо использовать QSqlQuery? Или QSqlQueryModel тоже можно?
ошибся, QSqlQuery конечно


Цитата(Steklova Olga @ 3.6.2013, 12:36) *
А что вы думаете о предложении lvlad ?
надо пробовать, решение не очевидное.
Steklova Olga Дата 3.6.2013, 10:36
 
Цитата(Litkevich Yuriy @ 31.5.2013, 19:33) *
Транзакции уверенно работают только при использовании QSqlQueryModel и всё. Как только начинают использоваться QSqlTableModel так всё сразу начинает глючить.

а ранее вы писали
Цитата(Litkevich Yuriy @ 21.3.2010, 0:52) *
Заменил QSqlTableModel, на простой QSqlQuery

Простите, так надо использовать QSqlQuery? Или QSqlQueryModel тоже можно?

А что вы думаете о предложении lvlad ?
Цитата(lvlad @ 18.6.2012, 14:35) *
чтобы исправить проблему необходимо в файле qsqltablemodel.cpp
в методе QSqlTableModelPrivate::exec закомментировать строку:
if (editQuery.driver() != db.driver())

После этого придется перекомпилировать Qt или модуль QtSql
Litkevich Yuriy Дата 31.5.2013, 19:33
 
Цитата(Steklova Olga @ 31.5.2013, 19:52) *
"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", вторая запись не сохраняется.

Такой с виду пример хороший, так и хочется списать, подкрутив кое-что. Может кто сказать, как довести этот пример до ума?

Что ж мне делать?
Как мне быть?
Как задачку
мне решить? :rolleyes:
Steklova Olga Дата 31.5.2013, 17:02
 
Цитата(Litkevich Yuriy @ 31.5.2013, 16:13) *
можно было создать домен, а остальное оставить как есть.
домен-то создать было можно, но такой запрос создания таблицы все равно бы не прошел

в примере в 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
 
Цитата(Steklova Olga @ 31.5.2013, 17:50) *
из-за того, что в 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) *
а как настроены модель и Мапер (режим)?

в примере в книге так:
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
Litkevich Yuriy Дата 31.5.2013, 15:09
  Steklova Olga, а как настроены модель и Мапер (режим)?

Цитата(Steklova Olga @ 31.5.2013, 16:08) *
MyModel *m = qobject_cast<MyModel *>(model());
к стати, это приведение излишне, т.к. методы модели, используемые в этой функции, объявлены в базовом классе модели.
Steklova Olga Дата 31.5.2013, 14:08
 
Цитата(Litkevich Yuriy @ 30.5.2013, 21:33) *
Там вроде ещё Tab также обрабатывается.
нет
Запустила пример, Tab не помогает при корректировки таблицы БД прямо в TableView.
Зато, при корректировке таблицы БД через QDataWidgetMapper помогает смена фокуса на другой контрол маппера с помощью Tab или курсора, а Enter в этом случае не подходит.

Цитата(Litkevich Yuriy @ 31.5.2013, 13:11) *
Ещё нюанс: при использовании Мапера становится невозможным использовать транзакции. Например, ты запускаешь транзакцию, пользователь взаимодействует с Мапером через виджеты, затем (по кнопке) фиксируешь трнзакцию. Фиксация при редактировании нескольких строк таблицы завершится неудачей. Т.к. в драйверах БД что-то идёт криво и ID транзакции используется неверный.
Почему вы говорите, что нельзя использовать транзакции? Может, я неверно поняла, что вы этим хотите сказать, о какой транзакции идет речь?
В примере chap18/db04 из книги Земскова "Qt4 на примерах" есть такой код:
void MyView::saveData(){
    MyModel *m = qobject_cast<MyModel *>(model());
    if ( ! m ) return;

    m->database().transaction();
    if (m->submitAll()) {
        m->database().commit();
    }else{
        m->database().rollback();
        QMessageBox::warning(this, tr("Error"),
                             tr("The database reported an error: %1")
                             .arg(m->lastError().text()));
        m->select();
    }
}
Тут есть транзакция.
Запускаю пример, редактирую одну запись таблицы БД в маппере, завершаю корректировку сменой фокуса с последнего откорректиррованного контрола на другой, затем аналогично редактирую другую запись, только после этого нажимаю кнопку "записать".
    QPushButton *btnSave = new QPushButton(tr("&Записать"));
    QObject::connect(btnSave, SIGNAL(clicked()), view, SLOT(saveData()));
И все срабатывает, все изменения обеих записей сохраняются в таблице БД. А вы о чем говорили?
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 14.7.2025, 4:08