Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не пойму, где ошибка...... [D5, Win2k]


QWest ©   (2002-05-23 17:28:00) 

Добрый вечер мастерам. Я че та не могу разобраться с куском кода:
procedure TfrmAddress.cmdDelCityClick(Sender: TObject);
begin
try
frmMain.adoc.Execute("delete from list_city where city_id = " + adoqCity.FieldByName("city_id").AsString + "");
except
ShowMessage("


MOA   (2002-05-24 14:23:00) [1]

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 отрабатывет это исключение нормально, единственное неудобство - сообщение юзеру на английском. Впрочем, сообщение это тоже не больно-то информативное, и названия полей и констрейнов тоже будут на буржуйском (если, конечно, не хочется приключений).
Удачи!


dimis   (2002-05-24 11:39:00) [2]

"ТАКОе" ЭТО КоТОРОЕ?


QWest   (2002-05-24 11:07:00) [3]

Уважаемые мастера, неужели никто не знает ??


QWest   (2002-05-24 09:46:00) [4]

??????


QWest   (2002-05-24 09:24:00) [5]

Всем привет, это снова я...
Значит ЭСКУЭЛ Сервер у меня Майкрософтовский, версия 7.0
А еще хотеллось бы спросить: можно ли после создания таблиц определить у них такое свойство??
Кстати таблицы я создавал сам (щелкаю правой клавишей мыши, выбираю Нью Тэйбл, в появившемся окне пишу название, в седующем окне пишу нужные поля, выбираю тип данных и галочками проставляю нужные св-ва...).
Дык вот и хотелось бы узнать, на каком этапе проставляется ЭТО свойство


Fay   (2002-05-24 07:06:00) [6]

2Johnmen

А ещё Windows бывает от разных контор.
И фломастеры с ксероксами.


Johnmen   (2002-05-24 00:23:00) [7]

>QWest : Нехорошо ковыряться в чужих базах ! :))))

1. SQLserver м.б. от разных контор, напр. Borland, MS, IBM, Oracle и т.д. (к вопросу о типе СУБД)
2. Про ссылочную целостность, конечно же, лучше что-нибудь почитать (а рассказывать - сплошной спам будет :))
3. В примере от ins есть неточности, в частности, не указан FOREIGN KEY.


ins   (2002-05-23 19:21:00) [8]

скопировал неудачно =-)

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
)


ins   (2002-05-23 19:16:00) [9]

в 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 является внешним ключом, по которому и определяется ссылочная целостность




QWest   (2002-05-23 19:02:00) [10]

"У тебя сервер контролирует это правило (оно тут кстати и есть ссылочная целосность) и не дает
удалить город со вложенными улицами.
(таблицы ты не сам создавал что ли? - это определяется как раз при ихсоздании)"-= хотелось бы поподробнее, а именно где при создании можно ЭТО определить ??


oomneeq   (2002-05-23 18:42:00) [11]

raise убери
ты ведь уже среагировал на ошибку
А ошибка как раз та что надо - есть подчиненные записи

У тебя сервер контролирует это правило (оно тут кстати и есть ссылочная целосность) и не дает
удалить город со вложенными улицами.
(таблицы ты не сам создавал что ли? - это определяется как раз при ихсоздании)
raise генерит ошибку повторно вот ты и наблюдаешь это сообщение
Если это не единственно возможная ошибка, то в ехсерt
нужно реагировать не на все а именно на нее
почитай учебник как селектировать эксепшены.
хотя с EOleException много не населектируешь IMHO


QWest   (2002-05-23 18:21:00) [12]

??????????????


QWest   (2002-05-23 18:11:00) [13]

Тип БД, если я правильно тебя понял, у меня SQLServer..
И еще хотелось бы узнать что такое "ссылочная целосность" ??


Johnmen   (2002-05-23 18:05:00) [14]

Не смотря на то, что ты упорно не называешь БД, скажу, что у тебя нарушение ссылочной целостности !!!


QWest   (2002-05-23 17:54:00) [15]

В 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 17:38:00) [16]

- как и куда они (улицы) вложены ?
- не указан тип БД
- какая ошибка ? (>...выводится какая-то ошибка...)


Наверх

Титульная страница Поиск, карта сайта Написать письмо