Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-18811
Марина
2002-01-25 09:03
2002.02.07
Динамическая память


1-18875
Gabi100
2002-01-23 10:48
2002.02.07
Прилипание формы


1-18898
Valentin2
2002-01-10 12:49
2002.02.07
Здравствуйте ещё раз!


1-18858
Shadow77
2002-01-21 09:33
2002.02.07
Где-бы взять прозрачный календарь?


1-18923
LamerMen
2002-01-24 09:56
2002.02.07
Что использовать TMemo TR..Edit?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский