Текущий архив: 2002.06.17;
Скачать: CL | DM;
ВнизНе пойму, где ошибка...... Найти похожие ветки
← →
QWest (2002-05-23 17:28) [0]Добрый вечер мастерам. Я че та не могу разобраться с куском кода:
procedure TfrmAddress.cmdDelCityClick(Sender: TObject);
begin
try
frmMain.adoc.Execute("delete from list_city where city_id = " + adoqCity.FieldByName("city_id").AsString + "");
except
ShowMessage("
← →
Johnmen (2002-05-23 17:38) [1]- как и куда они (улицы) вложены ?
- не указан тип БД
- какая ошибка ? (>...выводится какая-то ошибка...)
← →
QWest (2002-05-23 17:54) [2]В SQLserver сделана БД. Улицы связаны с городами т.о.:в таблице List_street есть три поля: Str_id, str_city, str_name В таблице
list_city два поля city_id, city_name. Эти таблицы связаны между собой так- city_id=str_city.
Ошибка: Project .. .exe raised exception class EOleException with message "DELETE statement conflicted with COLUMN REFERENCE constraint "FK_LIST_STREET_LIST_CITY". The conflict occurred in database "...", Table "LIST_STREET", column "STR_CITY"". Process stopped.Use step or Run to continue.
Извиняюсь, что долго - ошибку переписывал...
← →
Johnmen (2002-05-23 18:05) [3]Не смотря на то, что ты упорно не называешь БД, скажу, что у тебя нарушение ссылочной целостности !!!
← →
QWest (2002-05-23 18:11) [4]Тип БД, если я правильно тебя понял, у меня SQLServer..
И еще хотелось бы узнать что такое "ссылочная целосность" ??
← →
QWest (2002-05-23 18:21) [5]??????????????
← →
oomneeq (2002-05-23 18:42) [6]raise убери
ты ведь уже среагировал на ошибку
А ошибка как раз та что надо - есть подчиненные записи
У тебя сервер контролирует это правило (оно тут кстати и есть ссылочная целосность) и не дает
удалить город со вложенными улицами.
(таблицы ты не сам создавал что ли? - это определяется как раз при ихсоздании)
raise генерит ошибку повторно вот ты и наблюдаешь это сообщение
Если это не единственно возможная ошибка, то в ехсерt
нужно реагировать не на все а именно на нее
почитай учебник как селектировать эксепшены.
хотя с EOleException много не населектируешь IMHO
← →
QWest (2002-05-23 19:02) [7]"У тебя сервер контролирует это правило (оно тут кстати и есть ссылочная целосность) и не дает
удалить город со вложенными улицами.
(таблицы ты не сам создавал что ли? - это определяется как раз при ихсоздании)"-= хотелось бы поподробнее, а именно где при создании можно ЭТО определить ??
← →
ins (2002-05-23 19:16) [8]в IB это делается так
CREATE TABLE T_CITIES
(
city_id integer not null primary key,
city_name varchar(50)
)
CREATE TABLE T_STREETS
(
street_id integer not null primary key,
stret_name city_name varchar(50),
city_ref integer references T_CITIES (city_id) ON UPDATE CASCADE ON DELETE CASCADE
)
поле city_ref является внешним ключом, по которому и определяется ссылочная целостность
← →
ins (2002-05-23 19:21) [9]скопировал неудачно =-)
CREATE TABLE T_STREETS
(
street_id integer not null primary key,
streеt_name varchar(50),
city_ref integer references T_CITIES (city_id) ON UPDATE CASCADE ON DELETE CASCADE
)
← →
Johnmen (2002-05-24 00:23) [10]>QWest : Нехорошо ковыряться в чужих базах ! :))))
1. SQLserver м.б. от разных контор, напр. Borland, MS, IBM, Oracle и т.д. (к вопросу о типе СУБД)
2. Про ссылочную целостность, конечно же, лучше что-нибудь почитать (а рассказывать - сплошной спам будет :))
3. В примере от ins есть неточности, в частности, не указан FOREIGN KEY.
← →
Fay (2002-05-24 07:06) [11]2Johnmen
А ещё Windows бывает от разных контор.
И фломастеры с ксероксами.
← →
QWest (2002-05-24 09:24) [12]Всем привет, это снова я...
Значит ЭСКУЭЛ Сервер у меня Майкрософтовский, версия 7.0
А еще хотеллось бы спросить: можно ли после создания таблиц определить у них такое свойство??
Кстати таблицы я создавал сам (щелкаю правой клавишей мыши, выбираю Нью Тэйбл, в появившемся окне пишу название, в седующем окне пишу нужные поля, выбираю тип данных и галочками проставляю нужные св-ва...).
Дык вот и хотелось бы узнать, на каком этапе проставляется ЭТО свойство
← →
QWest (2002-05-24 09:46) [13]??????
← →
QWest (2002-05-24 11:07) [14]Уважаемые мастера, неужели никто не знает ??
← →
dimis (2002-05-24 11:39) [15]"ТАКОе" ЭТО КоТОРОЕ?
← →
MOA (2002-05-24 14:23) [16]2QWEST:таблицы я создавал сам
Следовательно, на диаграмме в EM или VS Вы соединили List_street.str_city и list_city.city_id (Да Вы и сами говорите "Эти таблицы связаны между собой так- city_id=str_city"). Это вот и называется ссылочная целостность (FOREIGN KEY в терминах MSSQL). Аналог на T-SQL
ALTER TABLE List_street ADD CONSTRAINT ["FK_LIST_STREET_LIST_CITY"] FOREIGN KEY ([str_city]) REFERENCES [list_city]([city_id])
А определять нужно не наличие ссылочного правила, а наличие подчинённой(ых) записи(ей) в List_street, например, так
SELECT TOP 1 str_city FROM List_street WHERE str_city = код-удаляемого-города.
Тогда можно выдать юзеру "Не могу удалить город Голопупинск так так в нем есть улица им. Пупкина".
Вариант - оформите удаление в виде процедуры - тогда сообщение пользователю Вы сможете выдать на русском без особых заморочек.
Или, действительно, ловить исключения (порядком мороки). Да и сообщения юзеру будут такие "Не могу удалить город Голопупинск т.к. в нем есть какие-то улицы".
Или переделать базу сообщений MSSQL на русский - мечта русских программеров на MSSQL :-) - дело в том, что DELPHI отрабатывет это исключение нормально, единственное неудобство - сообщение юзеру на английском. Впрочем, сообщение это тоже не больно-то информативное, и названия полей и констрейнов тоже будут на буржуйском (если, конечно, не хочется приключений).
Удачи!
Страницы: 1 вся ветка
Текущий архив: 2002.06.17;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.005 c