1

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

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

4

3 回答 3

3

首先阅读参数化 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;
于 2013-03-12T16:10:39.450 回答
0

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

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

于 2013-03-12T16:10:37.387 回答
0

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();
于 2013-03-12T16:10:44.610 回答