crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 29.3.2024, 13:04