Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.02.2011, 03:14
exy exy вне форума
Прохожий
 
Регистрация: 13.01.2010
Сообщения: 27
Репутация: 10
По умолчанию Ошибка Добавления в БД

Проблемы с записью В БД. Есть 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;
Вложения
Тип файла: 7z Рабочий стол.7z (7.2 Кбайт, 8 просмотров)

Последний раз редактировалось exy, 11.02.2011 в 14:48.
Ответить с цитированием
  #2  
Старый 11.02.2011, 05:15
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Попробуй через AppendRecord.
Ответить с цитированием
  #3  
Старый 11.02.2011, 10:46
exy exy вне форума
Прохожий
 
Регистрация: 13.01.2010
Сообщения: 27
Репутация: 10
По умолчанию

Никакой разницы нет, пробовал append post, insert post, insertrecord, appendrecord...
У меня такое ощущение что неправильно работает запрос на вставку.....
Ну помогите Плиз!!!!!!!!

Последний раз редактировалось exy, 12.02.2011 в 01:06.
Ответить с цитированием
  #4  
Старый 15.02.2011, 10:30
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Цитата:
Сообщение от exy
не хочет записываться потому что пытается записать Null значение в ключевое поле.
ощущение правильное.

Пс. вот не люблю я foreign key из за этого
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #5  
Старый 16.02.2011, 01:00
exy exy вне форума
Прохожий
 
Регистрация: 13.01.2010
Сообщения: 27
Репутация: 10
По умолчанию

И как же мне решить эту проблему???? подскажите, пожалуйста!!!
Ответить с цитированием
  #6  
Старый 16.02.2011, 02:36
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Выкладывай код запроса и структуру БД, посмотрим.

ЗЫ. Твой код целиком смотреть просто лень. Выложи именно значимые для проблемы куски в теле сообщения.
Ответить с цитированием
  #7  
Старый 16.02.2011, 10:19
exy exy вне форума
Прохожий
 
Регистрация: 13.01.2010
Сообщения: 27
Репутация: 10
По умолчанию

Запрос на вставку таков:
Код:
insert into PLAYERPOSITION
  (POSITIONID, PLAYERID, KOEFF)
values
  (:POSITIONID, :PLAYERID, :KOEFF)
Структура базы данных - в файле Безымянный.jpg
Изображения
Тип файла: jpg Безымянный.jpg (43.2 Кбайт, 10 просмотров)
Ответить с цитированием
  #8  
Старый 16.02.2011, 11:35
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Т.е. получается, что в таблице PlayerPosition поля PositionID,PlayerID являются одновременно FK и PK? PK там вообще нафик не нужен. Если вы хотите избежать повтора данных в PlayerPosition на уровне ядра БД, то просто сделайте уникальный индекс по этим полям.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 16.02.2011 в 11:37.
Ответить с цитированием
  #9  
Старый 16.02.2011, 11:55
exy exy вне форума
Прохожий
 
Регистрация: 13.01.2010
Сообщения: 27
Репутация: 10
По умолчанию

Ну во-первых, это нормально! Это дополнительная таблица, которая помогает разрулить отношение многие-ко-многим... Во-вторых, пробовал сделать дополнительный ключ а эти 2 атрибута сделать не PK... результат тот же к сожалению(( Вставка не происходит
Ответить с цитированием
  #10  
Старый 16.02.2011, 12:54
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Насчет нормально - спорный вопрос. Как вам такое утверждение - эта таблица не порождает ключи, она их использует, потому смысла в создании PK для этой табли нет никакого.
Попробовал создать типа вашей схемы и сделать вставку - все прокатывает.
Покажите последовательность заполнения таблиц данными. У меня это реализовано так:
Код:
insert into Player (FIO) values ('Иванов')
insert into OnGroundPosition (PositionName) values ('Корсика')
insert into PLAYERPOSITION (POSITIONID, PLAYERID, KOEFF) values (1, 1, 50)
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 16.02.2011, 14:15
exy exy вне форума
Прохожий
 
Регистрация: 13.01.2010
Сообщения: 27
Репутация: 10
По умолчанию

Страдалецъ!!! Благодаря вашей помощи я нашел в чем заключается ошибка! Смысл таков! По нажатию кнопки на форме я добавляю нового игрока и затем уже добавляю позиции на поле по этому игроку. НО!!! Для того чтобы внести по этому игроку позиции надо обновить данные по игрокам, у меня видимо этого не происходит... Так что суть проблемы найдена но как ее решить я по прежнему не понимаю((
Код нажатия кнопки на добавление:
Код:
 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  
Старый 16.02.2011, 15:05
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Я вы не смотрели, чему равно значение DataMForecast.dsPlayerPLAYERID.AsInteger между DataMForecast.dsPlayer.Insert и DataMForecast.dsPlayer.Post
и чему оно равно после DataMForecast.dsPlayer.Post?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 16.02.2011, 19:04
exy exy вне форума
Прохожий
 
Регистрация: 13.01.2010
Сообщения: 27
Репутация: 10
По умолчанию

Значение данного идешника создается автоматически триггером в БД при посте, поэтому между инсерт и пост оно нулевое, после post выдает нормальное адекватное значение

Последний раз редактировалось exy, 16.02.2011 в 21:08.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter