|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ошибка Добавления в БД
Проблемы с записью В БД. Есть 3 таблицы БД : Игрок(Player), позиция на поле(OnGroundPosition), позиция игрока на поле(PlayerPosition).
Таблицы Player и OnGroundPosition связаны отношением многие-ко-многим, которое разруливается с помощью введения дополнительной таблицы PlayerPosition(Атрибуты таблиц во вложенном файле ). Пытаюсь добавить Новую запись в таблицу PlayerPosition и он жалуется на то что "violation of foreign key constraint Integ_117 on table PlayerPosition. foreign key reference target does not exist" Параметры процедуры передаются правильно, но при этом создается ощущение что не хочет записываться потому что пытается записать Null значение в ключевое поле. код добавления Код:
procedure TPlayerEditForm.PlayerPositionsKoeff(PosID,PlayerN,Coeff: integer); begin DataMForecast.dsPlayerPosition.Insert; DataMForecast.dsPlayerPosition.FieldByName('PositionID').AsInteger := PosID; DataMForecast.dsPlayerPosition.FieldByName('PlayerID').AsInteger := PlayerN; DataMForecast.dsPlayerPosition.FieldByName('Koeff').AsInteger := Coeff; DataMForecast.dsPlayerPosition.Post; end; Последний раз редактировалось exy, 11.02.2011 в 14:48. |
#2
|
|||
|
|||
Попробуй через AppendRecord.
|
#3
|
|||
|
|||
Никакой разницы нет, пробовал append post, insert post, insertrecord, appendrecord...
У меня такое ощущение что неправильно работает запрос на вставку..... Ну помогите Плиз!!!!!!!! Последний раз редактировалось exy, 12.02.2011 в 01:06. |
#4
|
|||
|
|||
Цитата:
Пс. вот не люблю я foreign key из за этого Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение" |
#5
|
|||
|
|||
И как же мне решить эту проблему???? подскажите, пожалуйста!!!
|
#6
|
|||
|
|||
Выкладывай код запроса и структуру БД, посмотрим.
ЗЫ. Твой код целиком смотреть просто лень. Выложи именно значимые для проблемы куски в теле сообщения. |
#7
|
|||
|
|||
Запрос на вставку таков:
Код:
insert into PLAYERPOSITION (POSITIONID, PLAYERID, KOEFF) values (:POSITIONID, :PLAYERID, :KOEFF) |
#8
|
||||
|
||||
Т.е. получается, что в таблице PlayerPosition поля PositionID,PlayerID являются одновременно FK и PK? PK там вообще нафик не нужен. Если вы хотите избежать повтора данных в PlayerPosition на уровне ядра БД, то просто сделайте уникальный индекс по этим полям.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 16.02.2011 в 11:37. |
#9
|
|||
|
|||
Ну во-первых, это нормально! Это дополнительная таблица, которая помогает разрулить отношение многие-ко-многим... Во-вторых, пробовал сделать дополнительный ключ а эти 2 атрибута сделать не PK... результат тот же к сожалению(( Вставка не происходит
|
#10
|
||||
|
||||
Насчет нормально - спорный вопрос. Как вам такое утверждение - эта таблица не порождает ключи, она их использует, потому смысла в создании PK для этой табли нет никакого.
Попробовал создать типа вашей схемы и сделать вставку - все прокатывает. Покажите последовательность заполнения таблиц данными. У меня это реализовано так: Код:
insert into Player (FIO) values ('Иванов') insert into OnGroundPosition (PositionName) values ('Корсика') insert into PLAYERPOSITION (POSITIONID, PLAYERID, KOEFF) values (1, 1, 50) Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#11
|
|||
|
|||
Страдалецъ!!! Благодаря вашей помощи я нашел в чем заключается ошибка! Смысл таков! По нажатию кнопки на форме я добавляю нового игрока и затем уже добавляю позиции на поле по этому игроку. НО!!! Для того чтобы внести по этому игроку позиции надо обновить данные по игрокам, у меня видимо этого не происходит... Так что суть проблемы найдена но как ее решить я по прежнему не понимаю((
Код нажатия кнопки на добавление: Код:
DataMForecast.dsPlayer.Insert; DataMForecast.dsPlayer.FieldByName('CityID').AsInteger := DBLCBTown.KeyValue; DataMForecast.dsPlayer.FieldByName('CountryID').AsInteger := DBLCBNationality.KeyValue; DataMForecast.dsPlayer.FieldByName('PlayerStyleID').AsInteger := DBLCBPlayerStyle.KeyValue; DataMForecast.dsPlayer.FieldByName('TeamID').AsInteger := DBLCBTeam.KeyValue; DataMForecast.dsPlayer.FieldByName('FIO').AsString := PlayerNameEdit.Text; DataMForecast.dsPlayer.FieldByName('PlayerHeight').AsInteger := HeightSpinEdit.Value; DataMForecast.dsPlayer.FieldByName('PlayerWeight').AsInteger := WeightSpinEdit.Value; DataMForecast.dsPlayer.FieldByName('Birthday').AsDateTime := BirthdayEdit.Date; DataMForecast.dsPlayer.FieldByName('PlayerPhoto').Assign(Image1.Picture); DataMForecast.dsPlayer.FieldByName('TeamWorkLevel').AsInteger := TeamWorkLevelSpinEdit.Value; DataMForecast.dsPlayer.FieldByName('SkillLevel').AsInteger := SkillLevelSpinEdit.Value; DataMForecast.dsPlayer.FieldByName('TeamNumber').AsInteger := PlayerNumberSpinEdit.Value; DataMForecast.dsPlayer.Post; PlayerPositionsKoeff(1,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit1.Value); PlayerPositionsKoeff(2,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit2.Value); PlayerPositionsKoeff(3,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit3.Value); PlayerPositionsKoeff(4,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit4.Value); PlayerPositionsKoeff(5,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit5.Value); PlayerPositionsKoeff(6,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit6.Value); PlayerPositionsKoeff(7,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit7.Value); PlayerPositionsKoeff(8,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit8.Value); PlayerPositionsKoeff(9,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit9.Value); PlayerPositionsKoeff(10,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit10.Value); PlayerPositionsKoeff(11,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit11.Value); PlayerPositionsKoeff(12,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit12.Value); PlayerPositionsKoeff(13,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit13.Value); PlayerPositionsKoeff(14,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit14.Value); PlayerPositionsKoeff(15,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit15.Value); PlayerPositionsKoeff(16,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit16.Value); PlayerPositionsKoeff(17,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit17.Value); PlayerPositionsKoeff(18,DataMForecast.dsPlayerPLAYERID.AsInteger,SpinEdit18.Value); Close; |
#12
|
||||
|
||||
Я вы не смотрели, чему равно значение DataMForecast.dsPlayerPLAYERID.AsInteger между DataMForecast.dsPlayer.Insert и DataMForecast.dsPlayer.Post
и чему оно равно после DataMForecast.dsPlayer.Post? Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#13
|
|||
|
|||
Значение данного идешника создается автоматически триггером в БД при посте, поэтому между инсерт и пост оно нулевое, после post выдает нормальное адекватное значение
Последний раз редактировалось exy, 16.02.2011 в 21:08. |