Форум: "Базы";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизПроблемы с добавлением данных в базу данных Найти похожие ветки
← →
lockheed_man © (2004-04-03 01:12) [0]Проблема в том, что после добаления в DBGrid записей они не заносятся в базу данных ни после UpdateSQL(ukModify) ни после FlushBuffers. Выдает сообщение о том, что невозможно внести изменения в закрытый датасет.
Self.MainQuery.Close;
{ Self.MainUpdateSQL.Apply(ukModify);}
Self.MainQuery.FlushBuffers;
Self.MainQuery.Prepare;
Self.MainQuery.Open;
ukModify:
update Materials
set
CardNum = :CardNum,
Title = :Title,
Metriks = :Metriks,
Amount = :Amount,
Price = :Price
where
CardNum = :OLD_CardNum and
Title = :OLD_Title and
Metriks = :OLD_Metriks and
Amount = :OLD_Amount and
Price = :OLD_Price
← →
kaif © (2004-04-03 02:42) [1]А зачем закрывать запрос? Apply нужно применять при открытом запросе, а не при закрытом. При закрытом естественно ругаться будет.
← →
Anatoly Podgoretsky © (2004-04-03 12:57) [2]update не возвращает набор данных, поэтому Open не применимо.
← →
kaif © (2004-04-04 01:53) [3]2 Anatoly Podgoretsky © (03.04.04 12:57) [2]
Я думаю, что у автора вопроса все же прописан Select запрос тоже. Ошибка в том, что он его пытается сначала закрыть, а потом применять Apply(ukModify).
← →
lockheed_man © (2004-04-05 01:51) [4]Прочитал Ваши замечания. Запрос уже не закрываю и выполняю следующий код:
Self.MainUpdateSQL.Apply(ukModify);
Self.MainQuery.Prepare;
Self.MainQuery.ExecSQL;
Первоначальный запрос в MainQuery такой:
select * from Materials
group by Title, CardNum,Amount,Price, Metriks, ID
В результате,когда выполняю Modify,получаю такую ошибку: Update Failed. Может вместо Modify использовать Insert?
← →
ЮЮ © (2004-04-05 03:05) [5]Moжет не парится, пока не понимаешь, что есть что, и просто создать TUpdateSQL (который потом указать у MainQuery.UpdateObject) и в нём прописать нужные запросы для MainQuery, после чего просто использовать MainQuery.Insert/Edit/Post
← →
kaif © (2004-04-05 14:32) [6]Если в запросе прописано:
select * from Materials
group by Title, CardNum,Amount,Price, Metriks, ID
то нужно юзать не ExecSQL, а метод Open или свойство
Active := True
(что то же самое).
Честно говоря, я вообще не понимаю, в чем цель происходящего.
Например, зачем group by, если поле ID уникально и нет агрегатных функций. И зачем модифицировать по условиям
CardNum = :OLD_CardNum and
Title = :OLD_Title and
Metriks = :OLD_Metriks and
Amount = :OLD_Amount and
Price = :OLD_Price
если имеется поле ID.
Или я не понимаю, что это за ID такое. Надеюсь все же, что суррогатный ключ...
----------------------------
Подойди к задаче так:
1. Есть ли в таблице первичный ключ?
2. Если нет - то его следует создать в первую очередь.
3. Всякая модификация данных (update) в условии where должна иметь сравнение с этим первичным ключем. Тогда это будет работать гарантированно быстро и предсказуемо.
4. Разберись с тем, какие поля обязательны, а какие - нет (могут иметь значение null). Постарайся, чтобы как можно большее число полей было not null по определению, иначе потом в отчетах могут возникнуть проблемы при суммировании по таким полям (хотя в Paradox могут и не возникнуть - не помню, но в любом случае суммирование по полям null - плохой стиль).
5. Возьми, как советует ЮЮ © (05.04.04 03:05) [5], комбинацию компонентов TQuery и TUpdateSQL и постарайся добиться работы этой парочки во всех режимах (вставка, удаление, модификация).
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c