Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с добавлением данных в базу данных [D6, Paradox]


lockheed_man ©   (2004-04-03 01:12:00) 

Проблема в том, что после добаления в 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-05 14:32:00) [1]

Если в запросе прописано:

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 и постарайся добиться работы этой парочки во всех режимах (вставка, удаление, модификация).


ЮЮ   (2004-04-05 03:05:00) [2]

Moжет не парится, пока не понимаешь, что есть что, и просто создать TUpdateSQL (который потом указать у MainQuery.UpdateObject) и в нём прописать нужные запросы для MainQuery, после чего просто использовать MainQuery.Insert/Edit/Post


lockheed_man   (2004-04-05 01:51:00) [3]

Прочитал Ваши замечания. Запрос уже не закрываю и выполняю следующий код:
 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?


kaif   (2004-04-04 01:53:00) [4]

2 Anatoly Podgoretsky ©   (03.04.04 12:57) [2]
Я думаю, что у автора вопроса все же прописан Select запрос тоже. Ошибка в том, что он его пытается сначала закрыть, а потом применять Apply(ukModify).


Anatoly Podgoretsky   (2004-04-03 12:57:00) [5]

update не возвращает набор данных, поэтому Open не применимо.


kaif   (2004-04-03 02:42:00) [6]

А зачем закрывать запрос? Apply нужно применять при открытом запросе, а не при закрытом. При закрытом естественно ругаться будет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо