【问题标题】:Grab record ID after inserting the record [duplicate]插入记录后获取记录ID [重复]
【发布时间】:2013-03-12 16:06:11
【问题描述】:

我需要获取记录的 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);

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

【问题讨论】:

  • 你总是可以运行SELECT SCOPE_IDENTITY();
  • 使用参数防止sql注入。 stackoverflow.com/a/9319609/284240
  • 这是一个内部脚本,仅供我自己使用,没有其他人使用,我不担心SQL注入。不过还是谢谢你的建议。

标签: c# sql sql-server


【解决方案1】:

首先阅读参数化 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 以获取值(针对 Guid 等进行相应调整)

int id = (int)identifier;

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这项工作无需我修改大量代码,非常感谢。
    【解决方案3】:

    您将需要使用 ExecuteScalar 而不是 ExecuteNonQuery。获取 ID 的方法有很多种,但我会使用 SCOPE_IDENTITY()。

    您可以在此处查看 MSDN 上的示例: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-26
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      相关资源
      最近更新 更多