Форум: "Базы";
Текущий архив: 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,
- шляпка - разделитель команд в скриптах
для того, чтобы консоль поняла, что введен скрипт, нужно поменять ему разделитель по умолчанию, т.е. шляпку вместо точки с запятой
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c