Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.07;
Скачать: CL | DM;

Вниз

Инфа не удаляется в таблицах InterBase, что делаю неправильно?   Найти похожие ветки 

 
Radix   (2002-01-09 10:34) [0]

Хелп, мастера! Изучаю Interbase (толком ничего не знаю, больно не бейте:). Создаю Database и таблицу в ней, полей этак с двадцать, где половина integer, а другая varchar win1251, есть индекс, но нет праймари ки. Пишу прогу с IBQuery, IBDatabase, IBTransaction и TIBUpdateSQL, плюс DBEdit(по количеству полей) и навигатор (пока, чтоб не рисовать кнопки). Так вот, в таблицу инфу записать можно, но удалить никак - говорит Updates failed. Установка CashedUpdates=true ничем не помогает - инфа не удаляется :(. Пытался в 5 и 6-ом Дельфях и IB, но всё одно. При спользовании IBTable результат нормальный. Что же лучше использовать - IBQuery, просто Query или ещё что ? Что делаю неправильно ? Думаю сделать двузвенку, если сумею :). Кстати говоря, где что можно почитать про IB, в книжках по Делфям всё как-то мимоходом ? Заранее благодарю.


 
Fareader   (2002-01-09 11:37) [1]

А ты изменить данные можешь IBQuery или тоже Updates failed ?


 
wipr   (2002-01-09 12:03) [2]

Из книг советую найти "Delphi 3 и создание приложений баз данных" под редакцией Шумакова П.В. Для начинающих то что надо. Видел для Delphi 4 и 5, но мне больше нравивится для Delphi 3, хотя пишу в Delphi 6.
Что касается главного вопроса. Если ты используешь IBQuery или Query, то ты обязан использовать IBUpdateSQL или UpdateSQL, в которых прописал соответственно Insert, Update, Delete (SQL команды), далее необходимо использовать примерно следующий код, например при кнопки удалить (сохранить добавление или изменение):
try
Database1.StartTransaction;
Query1.ApplyUpdates;
Database1.Commit;
Query1.CommitUpdates;
except
Database1.Rollback;
Query1.CancelUpdates;
ShowMessage("Не могу удалить ...");
end;
И все должно получиться, если нет праймари ки на удаляемое поле в других таблицах, или не писал в триггере востановление удаленной записи.


 
evgeg   (2002-01-09 12:27) [3]

Скорее всего, изключение возникает из-за отсутсвия primary key.


 
Radix   (2002-01-09 12:39) [4]

Спасибо за ответы, посмотрю что получится.


 
dymka   (2002-01-09 14:12) [5]

Настоятельно рекомендую использовать PRIMARY KEY если даже у тебя нет поля в качестве которого его можно использовать. Создай его специально (например ID INTEGER NOT NULL PRIMARY KEY). Далее будет меньше головной боли. "Синхронизация" данных на сервере и на клиенте осуществляется по первичному ключу.


 
Radix   (2002-01-10 08:09) [6]

To wipr
К большому сожалению описанный вами код не идёт с используемыми компонетами. Просто нет у компонента IBQuery метода CommitUpdates, а у IBDatabase нет метода StartTransaction (зато есть у IBTransaction). Я сделал нечто подобное, но при прогоне после IBTransaction.StartTransaction у меня теряется коннект - где-то у кого-то Active становится false. Чувствую что всё-таки что-то делаю не так, а что?.. Переходить на TQuery и TDatabase не хочется по идейным соображениям :).
To All
Сделал праймари ки как писал dymka. Но особой разницы не почувствовал. Затем заменил связку IBQuery-IBUdateSQL на IBDataSet. И что ?... заработало. Ну это ладно. Меня волнует, что это работает без всякого кода наподобие описанного wipr"ом, только по нажатию соответствующих кнопок навигатора. Правда заполнить свойства IBDataSet типа DeleteSQL я не забыл :). Должен радоваться, но думаю просто так ничего не бывает, значит где-то когда-то у меня будет прокол...

Следующий вопрос - я делаю правильно или нет ?


 
dymka   (2002-01-10 09:00) [7]

Мой совет - используй компоненты FIBPlus - там много хороших фишек. Там DataSet вообще продвинутый с кучей опций - очень удобно. Также прямой директ к базе миную BDE.


 
Alexandr   (2002-01-10 09:19) [8]

2Radix:
>Следующий вопрос - я делаю правильно или нет ?

-У меня windows не виснет- скажите что я делаю не так?


 
evgeg   (2002-01-10 13:40) [9]

> dymka
Теперь, FIBPlus денег стоят, однако.


 
Radix   (2002-01-10 14:52) [10]

To Alexandr
Легко ехидничать когда Вы самый умный.


 
Alexandr   (2002-01-11 06:56) [11]

2evgeg: Это разве деньги...
Да и триал есть, да и старые, работающие версии есть.

2radix: Я не самый умный


 
Radix   (2002-01-11 07:48) [12]

Сделал я праймари ки ID INTEGER NOT NULL и начал делать генератор и триггер для этого столбца. В IB5 всё путём, но в 6-ой версии триггер не получается, хотя делаю всё аналогично. Выдаёт Unexpected end of command. Триггер пишу по учебнику, в хелпе тот же текст:

CREATE TRIGGER MY_TRG FOR DELA
ACTIVE
BEFORE INSERT
AS
BEGIN
NEW.ID=GEN_ID(MY_GEN,1);
END

Если убираю begin и end он говорит что не знает такого индентификатора NEW. Что скажите ?


 
fnatali   (2002-01-11 07:52) [13]

А SET TERM? SET TERM у тебя где? Посмотри синтаксис в хэлпе.


 
Alexandr   (2002-01-11 07:55) [14]

в IB5 и IB6 различий не должно быть.
Какой программой пользуешься?
пользуйся www.ibexpert.com

а begin-end конечно должен быть конечно...

смотри на ib.demo.ru все утилиты с описанием по работе с Interbase


 
Radix   (2002-01-11 09:01) [15]

Видел я SET TERM в хелпе, но не понял для чего он нужен. С ним тоже результат нулевой.
Действительно по идее различий быть не должно. У меня стоит IB Server, поставленный из дистрибутива шестого делфи. Тексты пишу в консоль.


 
Alexandr   (2002-01-11 09:28) [16]

вот оно что.
Не пишиши в консоли!, ИСПОЛЬЗУЙ БОЛЕЕ ПРОДВИНУТЫЕ инструменты.

это скорее всего глюк консоли.
Посмотри версию консоли.

а в Interbase 5 нормальная была WISQL, поэтому там работает.

посмотри на ib.demo.ru



 
Radix   (2002-01-11 09:32) [17]

Понял. Версию консоли сейчас не скажу, но это всё объясняет. А WISQL в шестой IB случайно работать не станет ? Пойду схожу на ib.demo.ru.

Спасибо


 
Desdechado   (2002-01-11 10:04) [18]

поставь перед текстом триггера
set term ^ ;


 
Fay   (2002-01-11 12:18) [19]

SET TERM ^;
CREATE TRIGGER MY_TRG FOR DELA
ACTIVE
BEFORE INSERT
AS
BEGIN
NEW.ID=GEN_ID(MY_GEN,1);
END
^
SET TERM ;^

А более продвинутые инструменты - бред.


 
Alexandr   (2002-01-11 12:21) [20]

2Fay:
кто табы про бред сказал? или ты сам допер?


 
dymka   (2002-01-11 13:21) [21]

Была такая трабла тоже, писал так

SET TERM ### ;

CREATE TRIGGER NEW_GTM FOR D_GTM ACTIVE
BEFORE INSERT AS
BEGIN
NEW.ID = GEN_ID(GEN_NEW_GTM, 1);
END ###

т.е. именно в таком форматировании у меня поняло :)))
пишешь токены по другому - фиг!


 
Radix   (2002-01-14 10:17) [22]

Для сведения - у меня сработал вариант с использованием SET TERM ^

Ни SET TERM !!! (как в хелпе), ни SET TERM ### (по предложению dymka) работать в моём случае не захотели. Хотя так и не понял для чего это нужно?


 
Desdechado   (2002-01-14 16:34) [23]

просто по умолчанию:
- точка с запятой - разделитель команд SQL,
- шляпка - разделитель команд в скриптах

для того, чтобы консоль поняла, что введен скрипт, нужно поменять ему разделитель по умолчанию, т.е. шляпку вместо точки с запятой



Страницы: 1 вся ветка

Текущий архив: 2002.02.07;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
6-18932
VS
2001-11-16 06:00
2002.02.07
Передача файлов по сети


4-19031
REL
2001-12-10 13:49
2002.02.07
Модем.


4-19025
Art
2001-11-18 18:06
2002.02.07
Как использовать ShellExecute?????


3-18730
Ghost!
2002-01-10 11:40
2002.02.07
Поиск ячейки и аналогичныйх ей


3-18755
Rub
2002-01-11 10:30
2002.02.07
Как добавить к TDBCtrlGrid-у горизонтальный ScrollBar?