将数据插入多个表

时间:2016-09-07 14:39:49

标签: c# sql-server

我需要帮助将数据插入到多个表中。我有3张桌子:

  • Revizija(rev_id,Broj_rev)
  • Verzija(verz_id,Broj_verz,rev_id)
  • Program(prog_id,Naziv_prog,verz_id)

与FK连接 - revizijaverzijaverzijaprogramski持续。

当我尝试运行程序时,我的插入失败。

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();

1 个答案:

答案 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语句中,如果省略列名,则需要为所有存在的字段提供值(否则引擎无法正确地将传递的值分配给匹配的列)为了清楚起见并避免将来出现错误指定将由查询更新的列