Как вставить данные в две таблицы, связанные через внешний ключ? - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь вставить данные в две таблицы, связанные друг с другом через внешний ключ.Таблица dbo.Ansatte имеет первичный ключ с именем ansatID, а таблица dbo.Login_data имеет первичный ключ с именем brugerID и внешний ключ AnsatID, которые ссылаются на первичный ключ ansatID в таблице dbo.Ansatte.Первичный ключ в обеих таблицах вставляется постепенно, когда выполняется запрос. Проблема заключается в том, что после выполнения запроса внешний ключ AnsatID в таблице dbo.Login_data по-прежнему равен NULL, несмотря на тот факт, что внешний ключ AnsatID ссылается на первичный ключ с именем ansatID втаблица dbo.Ansatte.

Я попытался установить для параметра IDENTITY_INSERT значение ON (в MS SQL Server Studio Management Studio), но это не помогает, так как я все еще получаю сообщение об ошибке, что IDENTITY_INSERT установлен на OFF.

Вот код:

try
                {
                    String ConnectionString = @"Data Source=.\SQLEXPRESS01;Initial Catalog=Vagtplan;Integrated Security=True";
                    SqlConnection myconnection = new SqlConnection(ConnectionString);
                    myconnection.Open();

                    SqlCommand AddWorkerCommand = myconnection.CreateCommand();
                    AddWorkerCommand.CommandText = "INSERT INTO dbo.Ansatte ([Navn], [Efternavn], [Adresse], [Postnummer], [Bynavn], [Email], [Mobilnr]) VALUES ( @Navn, @Efternavn, @Adresse, @Postnummer, @Bynavn, @Email, @Mobilnr)";

                    AddWorkerCommand.Parameters.AddWithValue("@Navn", textBox1.Text);
                    AddWorkerCommand.Parameters.AddWithValue("@Efternavn", textBox2.Text);
                    AddWorkerCommand.Parameters.AddWithValue("@Adresse", textBox3.Text);
                    AddWorkerCommand.Parameters.AddWithValue("@Postnummer", textBox4.Text);
                    AddWorkerCommand.Parameters.AddWithValue("@Bynavn", textBox5.Text);
                    AddWorkerCommand.Parameters.AddWithValue("@Email", textBox6.Text);
                    AddWorkerCommand.Parameters.AddWithValue("@Mobilnr", textBox7.Text);
                    AddWorkerCommand.ExecuteNonQuery();

                    SqlCommand AddUserCommand = myconnection.CreateCommand();
                    AddUserCommand.CommandText = "INSERT INTO dbo.Login_data ([Brugernavn], [Adgangskode], [Brugertype]) VALUES ( @Brugernavn, @Adgangskode, @Brugertype)";

                    AddUserCommand.Parameters.AddWithValue("@Brugernavn", textBox10.Text);
                    AddUserCommand.Parameters.AddWithValue("@Adgangskode", textBox9.Text);
                    AddUserCommand.Parameters.AddWithValue("@Brugertype", textBox8.Text);
                    AddUserCommand.ExecuteNonQuery();

                    myconnection.Close();
                    MessageBox.Show("Saved");
                }

                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

Желаемым результатом является то, что внешний ключ AnsatID в таблице dbo.Login_data имеет то же значение, что и первичный ключ ansatID в таблице dbo.Ansatte.Фактический результат показан на картинке ниже.Фактический результат заключается в том, что внешний ключ AnsatID в таблице dbo.Login_data по-прежнему равен NULL после выполнения вышеуказанного кода, как показано на рисунке:

enter image description here

1 Ответ

1 голос
/ 14 апреля 2019

Вы можете использовать scope_identity(), чтобы получить последнее использованное значение идентификатора в той же области.Поэтому изменение кода на

...
AddUserCommand.CommandText = "INSERT INTO dbo.Login_data ([ansatID], [Brugernavn], [Adgangskode], [Brugertype]) VALUES (scope_identity(), @Brugernavn, @Adgangskode, @Brugertype)";
...

должно делать то, что вы хотите.

Я также рекомендую не использовать AddWithValue(), который должен угадывать тип данных и иногда может быть ужасно неправильным.Используйте Add(), явно указав тип данных.Например,

...
AddWorkerCommand.Parameters.Add("@Navn", SqlDbType.NVarChar, 64).Value = textBox1.Text;
...

, если Navn является nvarchar(64) в базе данных.

...