我需要获取记录的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);
是的,我看到还有其他类似的问题,但我正在寻找上面代码的确切帮助,请不要将此重复标记,因为它不是!
答案 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();