Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];




Вниз

Инфа не удаляется в таблицах 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,
- шляпка - разделитель команд в скриптах

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




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.026 c
7-19012           T2                    2001-10-29 16:59  2002.02.07  
События Windows


3-18753           dim-                  2002-01-11 09:03  2002.02.07  
MSSQL


3-18767           Сидоров Юрий          2002-01-11 13:50  2002.02.07  
CacheSize в ADOTable


14-18986          programmer1           2001-12-19 21:28  2002.02.07  
Совместимость 5й и 4й версий дельфи и назначение rx units


1-18797           Super_Drive           2002-01-24 16:58  2002.02.07  
Проблема с Chart