我的要求我成功插入我想将最后一个增量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();
}
答案 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
}
}
}