Russian Qt Forum

Qt => Базы данных => Тема начата: masha от Август 18, 2009, 16:23



Название: Пропадают данные из TableView
Отправлено: masha от Август 18, 2009, 16:23

Подскажите, пожалуйста, что нужно сделать, чтобы не возникали следующие проблемы:
Qt 4.3, коннект через ODBC
1) отображая данные из БД (QSqlTableModel / QTableView) при отключении сервера или соединения (mDatabase.close()) данные из view пропадают;
2) имею на форме три модели ( QSqlTableModel и две QSqlQueryModel для комбобоксов ), выполняя ПРОСТОЙ запрос на редактирование 1ой таблицы - всё проходит нормально, а если (как мне необходимо) оформить запрос в виде транзакции (transaction(), commit(), rollback()), данные опять пропадают, причем во всех трёх вьюшках!! Для tableModel спасает select(), а с queryModel() всё как-то грустно  :( :(
Я что-то упускаю?? Может где-то хеширование надо применить, а где не пойму...


Название: Re: Пропадают данные из TableView
Отправлено: chu от Декабрь 07, 2010, 16:53
Цитировать
если (как мне необходимо) оформить запрос в виде транзакции (transaction(), commit(), rollback()), данные опять пропадают
у меня такая же же проблема. есть ответ?


Название: Re: Пропадают данные из TableView
Отправлено: twp от Декабрь 13, 2010, 19:46
открываем асистент и читаем:

bool QSqlDatabase::commit ()
Commits a transaction to the database if the driver supports transactions and a transaction() has been started. Returns true if the operation succeeded. Otherwise it returns false.
Note: For some databases, the commit will fail and return false if there is an active query using the database for a SELECT. Make the query inactive before doing the commit.

Вполне возможно, что это и является причиной пропадания данных, хотя явно об этом ничего не сказано


Название: Re: Пропадают данные из TableView
Отправлено: QuAzI от Декабрь 14, 2010, 01:02
Принципиально использовать ODBC? Без него проще ловить ошибки как правило, если речь про реальную SQL-базу.


Название: Re: Пропадают данные из TableView
Отправлено: chu от Декабрь 14, 2010, 15:56
Принципиально использовать ODBC? Без него проще ловить ошибки как правило, если речь про реальную SQL-базу.

А разве можно работать с БД без подключения драйвера?


Название: Re: Пропадают данные из TableView
Отправлено: QuAzI от Декабрь 14, 2010, 17:14
Можно работать с БД используя нормальный драйвер. ODBC это насколько помню не сам драйвер, а что-то типа обёртки. Причём давно протухшей и заброшенной MS так же, как BDE заброшено борландом - эти два костыля обычно ставились вместе и всесте сводили своими глюками. Есть ещё unixODBC, но при его наличии некоторый софт отказывается работать. Особенно радовало что поведение ODBC в отношении таблиц dBase(DBF) и Paradox различалось в зависимости от того, стоит драйвер или нет. Начиная с выбора кодировок, заканчивая некоторыми трудноуловимыми фичами. Из-за чего народ ломился на любые сторонние разработки - начиная с любимого всеми дельфистами tDbf (который сейчас включен в Lazarus), заканчивая всякими платными монстрилками типа Ado Data Suite.


Название: Re: Пропадают данные из TableView
Отправлено: crossly от Декабрь 14, 2010, 19:31
какая у вас СУБД?


Название: Re: Пропадают данные из TableView
Отправлено: chu от Декабрь 15, 2010, 14:40
ms sql server 2005


Название: Re: Пропадают данные из TableView
Отправлено: crossly от Декабрь 15, 2010, 23:37
по поводу первого пункта.. это нормально поведение... так и должно быть... по поводу второго... что возвращает commit() и lastError().text() ??


Название: Re: Пропадают данные из TableView
Отправлено: chu от Январь 24, 2011, 16:17
по поводу первого пункта.. это нормально поведение... так и должно быть... по поводу второго... что возвращает commit() и lastError().text() ??
commit() и lastError().text()  ничего не возвращают, программа продолжает работать, но записи в ячейках не отображаются, остается только прорисовка таблицы.
Функция:
Код:
void Limitcard_Form::deleteLDet()
{
    QModelIndex index = tableView->currentIndex();
    if (!index.isValid())
        return;
    QSqlDatabase db = QSqlDatabase::database();
    db.transaction();

    QSqlRecord record = model->record(index.row());
    int r = QMessageBox::question(this, tr("Удаление материала"),
                                  tr("Удалить \"%1\"?")
                                  .arg(record.value(Limit_Title).toString()),
                                  QMessageBox::Yes | QMessageBox::Default,
                                  QMessageBox::No | QMessageBox::Escape);
    if (r == QMessageBox::No) {
        db.rollback();
        return;
    }
    QSqlQuery query;
    query.exec(QString("DELETE FROM limitcard WHERE id = %1")
               .arg(record.value(Limit_Id).toInt()));

    db.commit();

    model->removeRow(tableView->currentIndex().row());
    model->submitAll();
}