我需要帮助将数据插入到多个表中。我有3张桌子:
Revizija
(rev_id,Broj_rev)Verzija
(verz_id,Broj_verz,rev_id)Program
(prog_id,Naziv_prog,verz_id)与FK连接 - revizija
至verzija
,verzija
至programski
持续。
当我尝试运行程序时,我的插入失败。
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Database1"].ConnectionString);
SqlCommand xp = new SqlCommand("Insert into Revizija Values(@Broj_rev)", con);
xp.Parameters.AddWithValue("@Broj_rev", textBox5.Text);
con.Open();
xp.ExecuteNonQuery();
con.Close();
SqlCommand xp1 = new SqlCommand("Insert into Verzija values(@Broj)", con);
xp1.Parameters.AddWithValue("@Broj", textBox4.Text);
con.Open();
xp1.ExecuteNonQuery();
con.Close();
SqlCommand xp4 = new SqlCommand("Insert into Program values (@Naziv_prog)", con);
xp4.Parameters.AddWithValue("@Naziv_prog", textBox2.Text);
con.Open();
xp4.ExecuteNonQuery();
con.Close();
答案 0 :(得分:1)
当您尝试在Verzija
表中插入数据时,您需要知道分配给Revizija
表主键的值,当您尝试在Program
表中插入记录时也会发生同样的情况带有Revizija
的{1}}表。
在这种情况下,您可以使用SQL Server一起执行两个命令的功能,并将前两个命令中的每个命令添加到sql SELECT SCOPE_IDENTITY
()命令文本中。 SCOPE_IDENTITY返回通过连接分配的最后一个IDENTITY值的值。可以使用ExecuteScalar读取该命令的结果,并将其用作以下命令的输入参数。
using(SqlConnection con = new SqlConnection(....))
using(SqlCommand xp = new SqlCommand(@"Insert into Revizija
(Broj_rev) Values(@Broj_rev);
SELECT SCOPE_IDENTITY()", con);
{
con.Open();
xp.Parameters.AddWithValue("@Broj_rev", textBox5.Text);
int rev_id Convert.ToInt32(xp.ExecuteScalar());
using(SqlCommand xp1 = new SqlCommand(@"Insert into Verzija
(Broj_verz, rev_id) values(@Broj,@rev_id);
SELECT SCOPE_IDENTITY()", con);
{
xp1.Parameters.AddWithValue("@Broj", textBox4.Text);
xp1.Parameters.AddWithValue("@rev_id", rev_id);
int verz_id = Convert.ToInt32(xp1.ExecuteScalar());
using(SqlCommand xp4 = new SqlCommand(@"Insert into Program
(Naziv_prog, verz_id) values (@Naziv_prog, @verz_id)", con);
{
xp4.Parameters.AddWithValue("@Naziv_prog", textBox2.Text);
xp4.Parameters.AddWithValue("@verz_id", verz_id);
xp4.ExecuteNonQuery();
}
}
}
另请注意,我已修复了查询中的主要错误。在INSERT INTO语句中,如果省略列名,则需要为所有存在的字段提供值(否则引擎无法正确地将传递的值分配给匹配的列)为了清楚起见并避免将来出现错误指定将由查询更新的列