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

时间:2019-04-14 13:51:41

标签: sql sql-server winforms foreign-keys primary-key

我正在尝试通过外键将数据插入到彼此相关的两个表中。表dbo.Ansatte有一个主键,称为ansatID,表dbo.Login_data有一个主键,其名称为brugerID和外键AnsatID,它们引用表dbo.Ansatte中的主键ansatID。当查询运行时,两个表中的主键都是增量插入的。问题是,运行查询后,表dbo.Login_data中的外键AnsatID仍然为NULL,尽管事实上,外键AnsatID引用了主键insatID。表dbo.Ansatte。

我已尝试将IDENTITY_INSERT设置为ON(在ms sql服务器管理工​​作室中),但是它没有帮助,因为我仍然收到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,如图所示:

enter image description here

1 个答案:

答案 0 :(得分:1)

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