插入记录后抓取记录ID

本文关键字:记录 ID 抓取 插入 | 更新日期: 2023-09-27 18:03:44

我需要获取记录的ID,这样我就可以将用户转发到包含他们刚刚提交的信息的另一个页面。我看了看关于这个的其他问题,人们建议使用SELECT SCOPE_IDENTITY()或OUTPUT,但我对c#和SQL真的很陌生,所以我不知道如何使用它与我现有的代码。如有任何帮助,不胜感激。

您可以看到,我需要将刚刚插入的记录的ID放在response.redirect中。

pcn.Open();
pcm.Connection = pcn;
string logon_user = Request.ServerVariables["LOGON_USER"].Substring(7);
var sql = String.Format(@"INSERT INTO Transfer (Status, Type, Name) values ('{0}','{1}','{2}')", '0', TypeTxtBox.Text.Replace("'", "''"), logon_user);
pcm.CommandText = sql;
pcm.ExecuteNonQuery();
pcn.Close();
Response.Redirect("View.aspx?ID=" + id);

是的,我看到还有其他类似的问题,但我正在寻找我上面的代码的确切帮助,不要标记这个重复,因为它不是!

插入记录后抓取记录ID

首先阅读参数化SQL,不要在SQL中使用字符串连接,因为你更有可能陷入SQL注入的混乱!

要获取ID,您需要更新代码,使其看起来像这样:
pcm.CommandText = "INSERT INTO Transfer (Status, Type, Name) values (@status, @type, @name);SELECT SCOPE_IDENTITY();";
object identifier = pcm.ExecuteScalar();

如果你的标识符是整数,你可以将identifier转换为int来获得值(根据Guids等进行相应调整)

int id = (int)identifier;

SCOPE_IDENTITY获取插入到范围内标识列中的最后一个标识值。SqlCommand.ExecuteScalar执行脚本,获取ID。

        var sql = String.Format(@"INSERT INTO Transfer (Status, Type, Name) values ('{0}','{1}','{2}')  
        SELECT CAST(scope_identity() AS int)"
    , '0', TypeTxtBox.Text.Replace("'", "''"), logon_user);
int ID = (int)pcm.ExecuteScalar();

您需要使用ExecuteScalar而不是ExecuteNonQuery。有多种方法可以获得ID,但我将使用SCOPE_IDENTITY()。

你可以在MSDN上看到一个例子:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx