插入记录后获取记录ID

时间:2013-03-12 16:06:12

标签: c# sql sql-server

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

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

3 个答案:

答案 0 :(得分: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以获取值(对Guids等进行相应调整)

int id = (int)identifier;

答案 1 :(得分:0)

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

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

答案 2 :(得分: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();