Member 11793260 Ответов: 1

Как вставить запись в две реляционные таблицы, используя VB.NET и SQL


Привет, это сообщение об ошибке, которое я получаю.
Оператор INSERT конфликтовал с ограничением ключа FOREING "FK_Emplooyees_CredentialID", конфликт произошел в базе данных "MainHolder", таблице"dbo.Credentials", столбце "CredentialID".

Что я уже пробовал:

Я пытаюсь вставить запись сотрудника в две таблицы, запись делится на две части, общую информацию и учетные данные для входа. Я создал связь между тремя таблицами Employee, Profiles и Credential, таблица employee имеет имя столбца CredentialID, этот столбец содержит два внешних ключа от Profile и Credential. Вот объяснение кода:

InsertCredential()

Если BuscarID = False, То
SQL.AddParam("@ID", EmpID)
Еще
txtEmpID.Текст = m_IDTemp
SQL.AddParam("@ID", m_IDTemp)
Конец, Если
SQL.AddParam("@FName", FName)
Для SQL.AddParam("@Lname В", Lname В)
SQL.AddParam ("@UInitials", инициалы)
SQL.AddParam ("@Permission", разрешения)
SQL.AddParam ("@Email", UserEmails)
SQL.AddParam("@PhoneNumb", PhoneNumb)
SQL.AddParam("@Dept", Dept)
Для SQL.AddParam("@Должность", Должность)
Для SQL.AddParam("@Статус", Статус)
SQL.AddParam("@TransDates", dtpStartDate.Text)
SQL.AddParam("@FKID", m_LastIDEntered) 'ID от привратника или учетные данные

Если m_UserNames = String.Затем пусто SQL.AddParam("@TransMadeBy", имена пользователей) Еще в SQL.AddParam("@TransMadeBy", m_UserNames)

Для SQL.ExecQuery("вставить в сотрудников (empid, lname в, имени, инициалы, электронную почту, телефонный номер, информация, отдел, должность, разрешение, TransDate, TransMadeBy, CredentialsID)" &ампер; " ценности(@ИД @lname в, @имени, @UInitials, электронная почта, @PhoneNumb, @статус @отдел, @должность, @позволения, @TransDates, @TransMadeBy, @FKID);")

SQL.AddParam ("@Users", имена пользователей)
SQL.AddParam ("@PIN", PINS)
SQL.AddParam("@TransDate", dtpStartDate.Text)

Если m_UserNames = String.Затем пусто SQL.AddParam("@TransMadeBy", имена пользователей) Еще в SQL.AddParam("@TransMadeBy", m_UserNames)

Если Разрешения = "Полный Контроль" Или Разрешения = "Администратор", То

Для SQL.ExecQuery("вставить в профиль (пароль, PIN-код, TransDate, TransMadeBy)" &ампер; " ценности (пользователи@, @шпилька, @TransDate, @TransMadeBy);" &ампер; "выберите функции scope_identity()")
Еще
Для SQL.ExecQuery("включить в учетные данные (Имя пользователя, PIN-код, TrnasDate, TransMadeBy)" &ампер; " ценности (пользователи@, @шпилька, @TransDates, @TransMadeBy);" + "выберите функции scope_identity()")

1 Ответов

Рейтинг:
0

OriginalGriff

Если у вас есть внешний ключ, идея заключается в том, что БД будет поддерживать ссылочная целостность для вас: он не позволит вам ввести значение внешнего ключа, которое не имеет соответствующего значения в ссылочной таблице.

Таким образом, проблема заключается в том, что вы вставляете записи в неправильном порядке: сначала должны быть вставлены данные ссылочной таблицы, а затем таблицы, которые ссылаются на них.

Я также настоятельно рекомендую вам посмотреть на использование транзакции здесь, чтобы предотвратить попадание "полуформированных данных" в вашу БД, если что-то не получится.