我如何得到最后一行插入的id

时间:2016-02-17 17:17:45

标签: c#

我想显示最后插入行的预订ID。我在下面给出了插入代码。请任何人都可以给我代码来显示id

    protected void Button1_Click(object sender, EventArgs e)
    {
        string cs = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(cs))
        {
            SqlCommand cmd;
            SqlDataReader dr;
            con.Open();
            cmd = new SqlCommand("insert into [booking] values('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + TextBox6.Text + "','" + TextBox7.Text + "','" + TextBox8.Text + "','" + TextBox9.Text + "','" + TextBox10.Text + "','" + TextBox11.Text + "')", con);

            cmd.ExecuteNonQuery();

        }
    }

2 个答案:

答案 0 :(得分:1)

我建议使用这样的东西:

protected void Button1_Click(object sender, EventArgs e)
{
    var cs = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
    using (var con = new SqlConnection(cs))
    {
        con.Open();
        var cmd = new SqlCommand(
            "DECLARE @IDReturnTable TABLE( ID INT ); INSERT INTO [booking] OUTPUT INSERTED.NameOfYourIdColumn INTO @IDReturnTable VALUES(@param1, @param2, @param3); SELECT ID FROM @IDReturnTable", 
            con);
        cmd.Parameters.Add("@param1", SqlDbType.VarChar).Value = TextBox1.Text;
        cmd.Parameters.Add("@param2", SqlDbType.VarChar).Value = TextBox2.Text;
        cmd.Parameters.Add("@param3", SqlDbType.VarChar).Value = TextBox3.Text;

        var returnedId = cmd.ExecuteScalar();
    }
}

我没有使用所有11个文本框,只用3来说明这种技术。

答案 1 :(得分:0)

您最好将此作为存储过程,并且不太容易注射。

要使用当前代码实现此功能,请添加对;SELECT SCOPE_IDENTITY()的调用:

cmd = new SqlCommand("insert into [booking] values('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + TextBox6.Text + "','" + TextBox7.Text + "','" + TextBox8.Text + "','" + TextBox9.Text + "','" + TextBox10.Text + "','" + TextBox11.Text + "');SELECT SCOPE_IDENTITY()", con);

execute as scalar

var id = cmd.ExecuteScalar();

(这假设你的桌子上有一个标识栏)

将其作为存储过程执行:

如果您拥有有限数量的值,则可以正常创建存储过程,每个@Parameter只有TextBox.Text,但最后会SELECT SCOPE_IDENTITY()

但看起来你有一个可变数量的输入,所以请参阅How to insert a multiple rows in SQL using stored procedures?,其中概述了使用表参数的方法和使用UDF分割值列表的方法。

同样,你需要在proc结尾处SELECT SCOPE_IDENTITY()来获取最后一行的标识。

有关选择上次插入ID的方法的详细讨论,请参阅What is the difference between Scope_Identity(), Identity(), @@Identity, and Ident_Current?