如何将数据插入到通过外键相关的两个表中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将数据插入到通过外键相关的两个表中?相关的知识,希望对你有一定的参考价值。

我正在尝试通过外键将数据插入到彼此相关的两个表中。表dbo.Ansatte有一个名为ansatID的主键,表dbo.Login_data有一个名为brugerID的主键和外键AnsatID,它引用表dbo.Ansatte中的主键ansatID。当查询运行时,两个表中的主键都会以递增方式插入。问题是,在运行查询后,表dbo.Login_data中的外键AnsatID仍为NULL,尽管外键AnsatID引用主键称为ansatID in表dbo.Ansatte。

我试图将IDENTITY_INSERT设置为ON(在ms sql server 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);
                }

期望的结果是表dbo.Login_data中的外键AnsatID与表dbo.Ansatte中的主键ansatID具有相同的值。实际结果如下图所示。实际结果是,表dbo.Login_data中的外键AnsatID在运行上面的代码后仍为NULL,如图所示:

答案

您可以使用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)

以上是关于如何将数据插入到通过外键相关的两个表中?的主要内容,如果未能解决你的问题,请参考以下文章

如何插入表有外键?

Access vba:如何在两个相关表中执行插入?

mysql外键插入

如何连接两个表中的数据并将结果插入到新表中?

如何根据数据透视表中两列(两个外键)中的 ID 返回相关模型?

使用 CodeIgniter 框架将数据插入到具有外键的多个表中