如何使用单个查询在SQL中获取最后一个递增的id

时间:2016-04-04 13:39:54

标签: asp.net sql-server

我的要求我成功插入我想将最后一个增量id绑定到根文件夹文件name.id在SQL中自动递增。我想在该粗体部位上绑定最后一个递增的id。

这是我的代码请帮我解决这个问题:

 string insert = "insert into Articles values('" + html+ "','" + text + "')";

 try
 {
     con.Open();
     SqlCommand cmd = new SqlCommand(insert, con);

     int i = cmd.ExecuteNonQuery();

     if (i > 0)
     {
         using (StreamWriter file = new StreamWriter(System.Web.Hosting.HostingEnvironment.MapPath(@"~\Articles\**ID**.html"), true))
         {
             file.WriteLine(value.editor); // Write the file.
         }  

         return msg;
     }
     else
     {
         return msg1;
     }
}
catch (Exception ex)
{
}
finally
{
    con.Close();
}

1 个答案:

答案 0 :(得分:5)

请注意,您的代码存在安全风险,因为sql injection在评论中正确地写了Sean Lange,因此很容易受到SCOPE_IDENTITY()攻击。 此外,正如他所指出的,空捕获是一个问题。帮自己一个忙,永远不要使用空的挡块。

要获取当前会话中最后生成的标识值,您应该使用Sql Server的{{3}}函数。
请注意,如果表SCOPE_IDENTITY()上有一个而不是插入触发器,会为您提供正确的值。

您的代码应如下所示:

string insert = "insert into Articles values(@html, @text); select scope_identity()";

using (var con = new SqlConnection("<YOUR CONNECTION STRING HERE>"))
{
    using (var cmd = new SqlCommand(insert, con))
    {
        cmd.Parameters.Add("@html", SqlDbType.NVarChar).Value = html;
        cmd.Parameters.Add("@text", SqlDbType.NVarChar).Value = text;
        try
        {
            con.Open();
            var databaseId = cmd.ExecuteScalar();
            if (databaseId is int)
            {
                using (StreamWriter file = new StreamWriter(System.Web.Hosting.HostingEnvironment.MapPath(string.Format(@"~\Articles\{0}.html", databaseId)), true))
                {
                    file.WriteLine(value.editor); // Write the file.
                }
                return msg;
            }
            else
            {
                return msg1;
            }
        }
        catch (Exception ex)
        {
            // Write to log, show an error message to the user                            
        }
    }
}