C# 如何使用asp和sql获取最后插入行的表ID(PK)

C# 如何使用asp和sql获取最后插入行的表ID(PK),c#,sql,asp.net,C#,Sql,Asp.net,我尝试使用下面的代码段获取最后插入行的值。我知道@IDENTITY和IDENTITY\u范围,但在asp参数化查询中编写代码时如何使用它们 SqlConnection MySQL = new SqlConnection(ConfigurationManager.ConnectionStrings["BloodDonorRegistrationConnectionString"].ToString()); string BloodReq = "insert into Bl

我尝试使用下面的代码段获取最后插入行的值。我知道@IDENTITY和IDENTITY\u范围,但在asp参数化查询中编写代码时如何使用它们

 SqlConnection MySQL = new SqlConnection(ConfigurationManager.ConnectionStrings["BloodDonorRegistrationConnectionString"].ToString());
            string BloodReq = "insert into Blood_Request(R_Name,R_Phone,R_Blood_Group,R_City,R_Address,Date,Time) values (@Name,@cell,@BGroup,@City,@Address,@date,@time)";

            SqlCommand Cmd = new SqlCommand(BloodReq, MySQL);
            Cmd.Parameters.AddWithValue("@Name", TextBoxName.Text);
            Cmd.Parameters.AddWithValue("@cell", TextBoxPhone.Text);
            Cmd.Parameters.AddWithValue("@BGroup", dropbownBlood.SelectedItem.Text);
            Cmd.Parameters.AddWithValue("@City", DropDownListCity.SelectedItem.Text);
            Cmd.Parameters.AddWithValue("@Address", TextBoxLocation.Text);
            Cmd.Parameters.AddWithValue("@date", DateTime.Now.Date);
            Cmd.Parameters.AddWithValue("@time", DateTime.Now.TimeOfDay);
            MySQL.Open();
            Cmd.ExecuteNonQuery();
            MySQL.Close();

请提前帮助和感谢。

使用
cmd.ExecuteScalar
而不是
cmd.ExecuteNonQuery()
。如果要返回更多值,还可以使用
ExecuteReader

...    
string BloodReq = "insert into Blood_Request(R_Name,R_Phone,R_Blood_Group,R_City,R_Address,Date,Time) values (@Name,@cell,@BGroup,@City,@Address,@date,@time); SELECT SCOPE_IDENTITY() AS IID";

...
var insertedID = (Int32)Cmd.ExecuteScalar();
在Sql中使用插入的
输出.ID
,如中所示

string BloodReq = "insert into Blood_Request(R_Name,R_Phone,R_Blood_Group,R_City,R_Address,Date,Time)
OUTPUT INSERTED.ID
values (@Name,@cell,@BGroup,@City,@Address,@date,@time)"

使用
cmd.ExecuteScalar
而不是
cmd.ExecuteNonQuery()
。如果要返回更多值,还可以使用
ExecuteReader

在Sql中使用插入的
输出.ID
,如中所示

string BloodReq = "insert into Blood_Request(R_Name,R_Phone,R_Blood_Group,R_City,R_Address,Date,Time)
OUTPUT INSERTED.ID
values (@Name,@cell,@BGroup,@City,@Address,@date,@time)"

使用
scope\u identity
,基于您的代码的完整工作示例如下:

using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["BloodDonorRegistrationConnectionString"].ToString())) {
    int insertedID;
    var cmd = "insert into Blood_Request(R_Name,R_Phone,R_Blood_Group,R_City,R_Address,Date,Time) values (@Name,@cell,@BGroup,@City,@Address,@date,@time);SELECT CAST(scope_identity() AS int)";
    using (var insertCommand = new SqlCommand(cmd, con)) {
               insertCommand.Parameters.AddWithValue("@Name", TextBoxName.Text);
               insertCommand.Parameters.AddWithValue("@cell", TextBoxPhone.Text);
               insertCommand.Parameters.AddWithValue("@BGroup", dropbownBlood.SelectedItem.Text);
               insertCommand.Parameters.AddWithValue("@City", DropDownListCity.SelectedItem.Text);
               insertCommand.Parameters.AddWithValue("@Address", TextBoxLocation.Text);
               insertCommand.Parameters.AddWithValue("@date", DateTime.Now.Date);
               insertCommand.Parameters.AddWithValue("@time", DateTime.Now.TimeOfDay);
               con.Open();
               insertedID = (int)insertCommand.ExecuteScalar();
    }

}

使用
scope\u identity
,基于您的代码的完整工作示例如下:

using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["BloodDonorRegistrationConnectionString"].ToString())) {
    int insertedID;
    var cmd = "insert into Blood_Request(R_Name,R_Phone,R_Blood_Group,R_City,R_Address,Date,Time) values (@Name,@cell,@BGroup,@City,@Address,@date,@time);SELECT CAST(scope_identity() AS int)";
    using (var insertCommand = new SqlCommand(cmd, con)) {
               insertCommand.Parameters.AddWithValue("@Name", TextBoxName.Text);
               insertCommand.Parameters.AddWithValue("@cell", TextBoxPhone.Text);
               insertCommand.Parameters.AddWithValue("@BGroup", dropbownBlood.SelectedItem.Text);
               insertCommand.Parameters.AddWithValue("@City", DropDownListCity.SelectedItem.Text);
               insertCommand.Parameters.AddWithValue("@Address", TextBoxLocation.Text);
               insertCommand.Parameters.AddWithValue("@date", DateTime.Now.Date);
               insertCommand.Parameters.AddWithValue("@time", DateTime.Now.TimeOfDay);
               con.Open();
               insertedID = (int)insertCommand.ExecuteScalar();
    }

}

您正在进行inser查询,因此我相信您只会得到一个确定的答案。我的建议是在事务中添加一个StoreProcedure,它分为两个步骤。第一步做插入,第二步得到最新的id。你正在做一个插入查询,所以我相信你会得到一个确定的答案。我的建议是在事务中添加一个StoreProcedure,它分为两个步骤。第一步执行插入,第二步获取最新id。因此,不需要使用ExecuteOnQuery()?由于我插入的数据类型为varchar。@IbtisamTanveer您需要在查询中返回一个结果,因此我不会使用
ExecuteNonQuery
。是的,我理解为什么我应该使用cmd.ExecuteScalar,但我必须在同一个查询中插入数据time@ibtisam-坦维尔:没问题。谢谢。所以不需要使用ExecuteOnQuery()?由于我插入的数据类型为varchar。@IbtisamTanveer您需要在查询中返回一个结果,因此我不会使用
ExecuteNonQuery
。是的,我理解为什么我应该使用cmd.ExecuteScalar,但我必须在同一个查询中插入数据time@ibtisam-坦维尔:没问题。谢谢。所以不需要使用ExecuteOnQuery()?当我插入varchar类型的数据时。如果使用
ExecuteNonQuery()
则无法检索返回的数据<代码>输出是一项非常强大的技术。例如,在
update
上,您实际上可以同时返回inserted和deleted:
OUTPUT inserted.Name,deleted.Name
。当您使用
scope\u identity()
时,它是有限的,您基本上运行两个命令。输出集所有功能于一身,非常灵活。因此无需使用ExecuteOnQuery()?当我插入varchar类型的数据时。如果使用
ExecuteNonQuery()
则无法检索返回的数据<代码>输出是一项非常强大的技术。例如,在
update
上,您实际上可以同时返回inserted和deleted:
OUTPUT inserted.Name,deleted.Name
。当您使用
scope\u identity()
时,它是有限的,您基本上运行两个命令。输出集所有功能于一身,非常灵活。