Russian Qt Forum
Сентябрь 30, 2024, 10:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Пропадают данные из TableView  (Прочитано 6229 раз)
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() всё как-то грустно  Грустный Грустный
Я что-то упускаю?? Может где-то хеширование надо применить, а где не пойму...
Записан
chu
Гость
« Ответ #1 : Декабрь 07, 2010, 16:53 »

Цитировать
если (как мне необходимо) оформить запрос в виде транзакции (transaction(), commit(), rollback()), данные опять пропадают
у меня такая же же проблема. есть ответ?
« Последнее редактирование: Декабрь 07, 2010, 16:54 от chu » Записан
twp
Гость
« Ответ #2 : Декабрь 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.

Вполне возможно, что это и является причиной пропадания данных, хотя явно об этом ничего не сказано
« Последнее редактирование: Декабрь 13, 2010, 19:49 от twp » Записан
QuAzI
Гость
« Ответ #3 : Декабрь 14, 2010, 01:02 »

Принципиально использовать ODBC? Без него проще ловить ошибки как правило, если речь про реальную SQL-базу.
Записан
chu
Гость
« Ответ #4 : Декабрь 14, 2010, 15:56 »

Принципиально использовать ODBC? Без него проще ловить ошибки как правило, если речь про реальную SQL-базу.

А разве можно работать с БД без подключения драйвера?
Записан
QuAzI
Гость
« Ответ #5 : Декабрь 14, 2010, 17:14 »

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

какая у вас СУБД?
Записан
chu
Гость
« Ответ #7 : Декабрь 15, 2010, 14:40 »

ms sql server 2005
Записан
crossly
Гость
« Ответ #8 : Декабрь 15, 2010, 23:37 »

по поводу первого пункта.. это нормально поведение... так и должно быть... по поводу второго... что возвращает commit() и lastError().text() ??
Записан
chu
Гость
« Ответ #9 : Январь 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();
}
« Последнее редактирование: Январь 24, 2011, 17:07 от chu » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.109 секунд. Запросов: 21.