Russian Qt Forum

Qt => Базы данных => Тема начата: crossly от Март 28, 2008, 15:47



Название: QSqlTableModel и view
Отправлено: crossly от Март 28, 2008, 15:47
имеется вьюшка.... 3 тригера (вставка, редактирование, удаление).... использую QSqlRelationalTableModel... новая запись вставляется без проблем, а вот апдэйт и удаление не работают... мот кто сталкивался....??


Название: Re: QSqlTableModel и view
Отправлено: stealth от Апрель 04, 2008, 19:25
не совсем понятен вопрос, вьюшка в БД? если да, то редактирование и удаление работать отказываются скорее всего из-за каких-либо неопределённостей, которые получает БД


Название: Re: QSqlTableModel и view
Отправлено: crocus от Апрель 05, 2008, 02:11
похоже,что в таблице нет ключа


Название: Re: QSqlTableModel и view
Отправлено: lit-uriy от Апрель 06, 2008, 08:24
а вот апдэйт и удаление не работают... мот кто сталкивался....??
а как это проявляется, БД ошибку дает? Если да, то какую?


Название: Re: QSqlTableModel и view
Отправлено: Shamil от Март 18, 2009, 18:00
Подниму тему, аналогичная проблема.
Дано: SQLite, таблицы "recipes" и "units", вьюшка "recipes_units", триггеры "insert_recipe", "update_recipe", "delete_recipe"

Код:
CREATE TABLE recipes (id INTEGER PRIMARY KEY AUTOINCREMENT, food INTEGER, ingredient INTEGER, quantity REAL)

CREATE TABLE units (id INTEGER PRIMARY KEY, name TEXT)

CREATE VIEW recipes_units
  AS SELECT recipes.id AS id, recipes.food AS food, recipes.ingredient AS ingredient, recipes.quantity AS quantity, ingredients.unit as units
  FROM recipes, ingredients WHERE recipes.ingredient = ingredients.id

CREATE TRIGGER insert_recipe INSTEAD OF INSERT ON recipes_units
BEGIN
  INSERT INTO recipes (food, ingredient, quantity) VALUES (new.food, new.ingredient, new.quantity);
END

CREATE TRIGGER update_recipe INSTEAD OF UPDATE ON recipes_units
BEGIN
  UPDATE recipes SET food=new.food, ingredient=new.ingredient, quantity=new.quantity WHERE id=old.id;
END

CREATE TRIGGER delete_recipe INSTEAD OF DELETE ON recipes_units
BEGIN
  DELETE FROM recipes WHERE id=old.id;
END

m_pRecipesModel->setTable("recipes_units");

Проблема та же: pRecipesModel->insertRow работает, а pRecipesModel->removeRow не приводит ни к каким результатам, обновление тоже не работает. Ошибок эти функции не возвращают.

При этом если делать через запросы типа
Код:
UPDATE recipes_units SET quantity=13 WHERE id=1
DELETE FROM recipes_units WHERE id=1
то все нормально.

Нет мыслей?


Название: Re: QSqlTableModel и view
Отправлено: miha-ha от Март 19, 2009, 09:55
Обрати внимание:
CREATE VIEW recipes_units
  AS SELECT recipes.id AS id, recipes.food AS food, recipes.ingredient AS ingredient, recipes.quantity AS quantity, ingredients.unit as units
  FROM recipes, ingredients WHERE recipes.ingredient = ingredients.id

а где описание таблицы: ingredients ????
Может в этом проблема?


Название: Re: QSqlTableModel и view
Отправлено: Shamil от Март 19, 2009, 11:36
Я описание ingredients не привел просто, вот оно:
Код:
CREATE TABLE ingredients (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, quantity REAL, unit INTEGER)

У меня такое чувство, что Qt обновление и удаление делает как-то не через запросы UPDATE и DELETE, а иначе. Хотя глупость наверное :)

В удалении можно removeRow заменить на запрос DELETE. А вот как с обновлением быть, надо глубже в дебри лезть  :o


Название: Re: QSqlTableModel и view
Отправлено: miha-ha от Март 20, 2009, 09:29
Возможно дело в Sqlite... вот что нарыл:
"В SQLite "VIEW"-хи доступны только для чтения. На вьюхах вы не можете выполнять операции "DELETE", "INSERT" или "UPDATE". Но, если вы в этом нуждаетесь, то можете создать триггер, который запросами в своем теле выполнит "DELETE", "INSERT" или "UPDATE" вьюхи. "
но триггеры ведь создаются....



Название: Re: QSqlTableModel и view
Отправлено: miha-ha от Март 20, 2009, 10:57
Вот что пишут на http://www.sqlite.org/lang_createtrigger.html:
Note that currently, triggers may behave oddly when created on tables with INTEGER PRIMARY KEY fields. If a BEFORE trigger program modifies the INTEGER PRIMARY KEY field of a row that will be subsequently updated by the statement that causes the trigger to fire, then the update may not occur. The workaround is to declare the table with a PRIMARY KEY column instead of an INTEGER PRIMARY KEY column.

Последнее предложение говорит, что возможно придется изменить INTEGER PRIMARY KEY на PRIMARY KEY...