crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Баг в QSqlTableModel?, Старанное поведение с записями у которых одно поле содержит NULL
Kagami
  опции профиля:
сообщение 12.3.2009, 15:40
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Написал небольшую программку для графической работы со своей базой sqlite3.
Базу создавал следующим SQL-запросом:
"CREATE TABLE updates (name TEXT UNIQUE, file TEXT, params TEXT)"

Потом сделал форму с QTableView и, соответственно, стал использовать QSqlTableModel. В конструкторе у меня есть такие строчки:
    //updatesDb - указатель на уже открытую ранее базу данных
    model = new QSqlTableModel(this, *updatesDb);
    tableView->setModel(model);
    model->setTable("updates");

А еще добавил слот, который вызывается по нажатию кнопки Del для удаления записи:
void UpdateBaseViewer::deleteRecord() {
    QMessageBox::information(this, "Deleting record", "Deleting started", QMessageBox::Ok, QMessageBox::Ok);
    int currentRow = tableView->currentIndex().row();
    model->removeRows(currentRow, 1);
    if (model->rowCount() == currentRow) tableView->setCurrentIndex(model->index(currentRow - 1,0));
    else tableView->setCurrentIndex(model->index(currentRow,0));
}

Строки в базу у меня добавлялись с помощью QSqlQuery:
    query.prepare("INSERT INTO updates VALUES (?, ?, ?)");
    query.addBindValue(updateName);
    query.addBindValue(updateFile);
    query.addBindValue(updateParams);
    query.exec();

при этом были строки, у которых третий параметр был NULL. Так вот, с такими строками я ничего не могу сделать ни в QTableView, ни в QSqlTableModel - ни удалить, ни изменить.
Это баг или фича?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.3.2009, 16:08
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Kagami @ 12.3.2009, 18:40) *
ак вот, с такими строками я ничего не могу сделать ни в QTableView, ни в QSqlTableModel - ни удалить, ни изменить.
попробуй открыть свою базу (с NULL'ами) в демке demos\sqlbrowser и поработать с БД в ней, будут косячки или нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 12.3.2009, 16:14
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


То же самое - если все поля заполнены, то с ними можно работать. Если есть NULL - после перехода на другую строку все возвращается как было. Пока нашел небольшой workaround - делать не нулевую, а пустую строку, т.е. QString(""). Выглядит одинаково, но с такими значениями уже можно работать ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.3.2009, 16:15
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Kagami, любопытно, а можешь БД дать?
Qt какой версии?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 12.3.2009, 16:18
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Первый раз заметил еще на 4.4.3, сейчас сижу на 4.5.
Прикрепленные файлы
Прикрепленный файл  updates.zip ( 3,77 килобайт ) Кол-во скачиваний: 111
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.3.2009, 19:43
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Kagami, факт глюкаво

однако сосвоей БД я такого не наблюдаю

Создается так
    // Создаем таблицу груп пользователей
    querystr=" \
        CREATE TABLE APPGROUP \
        (  \
          F_ID            INTEGER    PRIMARY KEY AUTOINCREMENT,    /* Код группы - Первичный ключ */ \
          F_GROUP        Text        /* группа */ \
        ); \
        ";
    ok = appdbquery.exec(querystr);

Прикрепленный файл  app.zip ( 1,02 килобайт ) Кол-во скачиваний: 164


и вставку в коде я делаю не так как ты:
Цитата
INSERT INTO APPGROUP (F_ID, F_GROUP)VALUES (:id, :group)
т.е. перечисляю поля для вставки.
код:
    // Заполняем таблицу груп пользователей    
    querystr="INSERT INTO APPGROUP (F_ID, F_GROUP) VALUES (:id, :group)";
    appdbquery.prepare(querystr);
    appdbquery.bindValue(":id", GID_ROOT); appdbquery.bindValue(":group", "root");
    appdbquery.exec();
    appdbquery.bindValue(":id", GID_ADMIN); appdbquery.bindValue(":group", "admin");
    appdbquery.exec();
    appdbquery.bindValue(":id", GID_USER); appdbquery.bindValue(":group", "user");
    ok = appdbquery.exec();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 13.3.2009, 21:59
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Попробуй вот так :)
    appdbquery.bindValue(":id", GID_ADMIN); appdbquery.bindValue(":group", QString());
    appdbquery.exec();

Я понимаю, так делать не хорошо, но если это позволяется, то почему бы и нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.3.2009, 22:28
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Kagami @ 14.3.2009, 0:59) *
Я понимаю, так делать не хорошо, но если это позволяется, то почему бы и нет?
ты имеешь в виду QString()?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 13.3.2009, 23:03
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Я имел в виду писать в базу NULL. Хотя вроде стандартом это не запрещено
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.3.2009, 9:39
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Kagami @ 14.3.2009, 2:03) *
Я имел в виду писать в базу NULL

Цитата
void QSqlQuery::addBindValue ( const QVariant & val, QSql::ParamType paramType = QSql::In )
Adds the value val to the list of values when using positional value binding. The order of the addBindValue() calls determines which placeholder a value will be bound to in the prepared query. If paramType is QSql::Out or QSql::InOut, the placeholder will be overwritten with data from the database after the exec() call.
To bind a NULL value, use a null QVariant; for example, use QVariant(QVariant::String) if you are binding a string.


т.к. QString() имеет своё собственное представление отличное от NULL в БД
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 3:16