我正在尝试通过外键将数据插入到彼此相关的两个表中。表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)
。