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