![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Инфа не удаляется в таблицах InterBase, что делаю неправильно? [D5, D6, IB5.x, IB6.x, ]
Radix © (2002-01-09 10:34:00)Хелп, мастера! Изучаю Interbase (толком ничего не знаю, больно не бейте:). Создаю Database и таблицу в ней, полей этак с двадцать, где половина integer, а другая varchar win1251, есть индекс, но нет праймари ки. Пишу прогу с IBQuery, IBDatabase, IBTransaction и TIBUpdateSQL, плюс DBEdit(по количеству полей) и навигатор (пока, чтоб не рисовать кнопки). Так вот, в таблицу инфу записать можно, но удалить никак - говорит Updates failed. Установка CashedUpdates=true ничем не помогает - инфа не удаляется :(. Пытался в 5 и 6-ом Дельфях и IB, но всё одно. При спользовании IBTable результат нормальный. Что же лучше использовать - IBQuery, просто Query или ещё что ? Что делаю неправильно ? Думаю сделать двузвенку, если сумею :). Кстати говоря, где что можно почитать про IB, в книжках по Делфям всё как-то мимоходом ? Заранее благодарю.
Desdechado (2002-01-14 16:34:00) [1]просто по умолчанию:
- точка с запятой - разделитель команд SQL,
- шляпка - разделитель команд в скриптах
для того, чтобы консоль поняла, что введен скрипт, нужно поменять ему разделитель по умолчанию, т.е. шляпку вместо точки с запятой
Radix (2002-01-14 10:17:00) [2]Для сведения - у меня сработал вариант с использованием SET TERM ^
Ни SET TERM !!! (как в хелпе), ни SET TERM ### (по предложению dymka) работать в моём случае не захотели. Хотя так и не понял для чего это нужно?
dymka (2002-01-11 13:21:00) [3]Была такая трабла тоже, писал так
SET TERM ### ;
CREATE TRIGGER NEW_GTM FOR D_GTM ACTIVE
BEFORE INSERT AS
BEGIN
NEW.ID = GEN_ID(GEN_NEW_GTM, 1);
END ###
т.е. именно в таком форматировании у меня поняло :)))
пишешь токены по другому - фиг!
Alexandr (2002-01-11 12:21:00) [4]2Fay:
кто табы про бред сказал? или ты сам допер?
Fay (2002-01-11 12:18:00) [5]SET TERM ^;
CREATE TRIGGER MY_TRG FOR DELA
ACTIVE
BEFORE INSERT
AS
BEGIN
NEW.ID=GEN_ID(MY_GEN,1);
END
^
SET TERM ;^
А более продвинутые инструменты - бред.
Desdechado (2002-01-11 10:04:00) [6]поставь перед текстом триггера
set term ^ ;
Radix (2002-01-11 09:32:00) [7]Понял. Версию консоли сейчас не скажу, но это всё объясняет. А WISQL в шестой IB случайно работать не станет ? Пойду схожу на ib.demo.ru.
Спасибо
Alexandr (2002-01-11 09:28:00) [8]вот оно что.
Не пишиши в консоли!, ИСПОЛЬЗУЙ БОЛЕЕ ПРОДВИНУТЫЕ инструменты.
это скорее всего глюк консоли.
Посмотри версию консоли.
а в Interbase 5 нормальная была WISQL, поэтому там работает.
посмотри на ib.demo.ru
Radix (2002-01-11 09:01:00) [9]Видел я SET TERM в хелпе, но не понял для чего он нужен. С ним тоже результат нулевой.
Действительно по идее различий быть не должно. У меня стоит IB Server, поставленный из дистрибутива шестого делфи. Тексты пишу в консоль.
Alexandr (2002-01-11 07:55:00) [10]в IB5 и IB6 различий не должно быть.
Какой программой пользуешься?
пользуйся www.ibexpert.com
а begin-end конечно должен быть конечно...
смотри на ib.demo.ru все утилиты с описанием по работе с Interbase
fnatali (2002-01-11 07:52:00) [11]А SET TERM? SET TERM у тебя где? Посмотри синтаксис в хэлпе.
Radix (2002-01-11 07:48:00) [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. Что скажите ?
Alexandr (2002-01-11 06:56:00) [13]2evgeg: Это разве деньги...
Да и триал есть, да и старые, работающие версии есть.
2radix: Я не самый умный
Radix (2002-01-10 14:52:00) [14]To Alexandr
Легко ехидничать когда Вы самый умный.
evgeg (2002-01-10 13:40:00) [15]> dymka
Теперь, FIBPlus денег стоят, однако.
Alexandr (2002-01-10 09:19:00) [16]2Radix:
>Следующий вопрос - я делаю правильно или нет ?
-У меня windows не виснет- скажите что я делаю не так?
dymka (2002-01-10 09:00:00) [17]Мой совет - используй компоненты FIBPlus - там много хороших фишек. Там DataSet вообще продвинутый с кучей опций - очень удобно. Также прямой директ к базе миную BDE.
Radix (2002-01-10 08:09:00) [18]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-09 14:12:00) [19]Настоятельно рекомендую использовать PRIMARY KEY если даже у тебя нет поля в качестве которого его можно использовать. Создай его специально (например ID INTEGER NOT NULL PRIMARY KEY). Далее будет меньше головной боли. "Синхронизация" данных на сервере и на клиенте осуществляется по первичному ключу.
Radix (2002-01-09 12:39:00) [20]Спасибо за ответы, посмотрю что получится.