C#+ SQL Server ExecuteScalar()没有返回最后插入的id

我有以下函数执行查询并在成功时返回true,在失败时返回false。 不,我想扩展该方法,以便在每个触发的插入查询中,类var insertId包含最后插入的行的ID。

问题是insertId总是0,所以executeScalar()不会返回ID。

有任何想法吗? 或其他解决方案来获取最后一个插入查询的ID ….

  public int insertId; public bool executeCommand(string q) { q += "; SELECT @@IDENTITY AS LastID"; bool retour = true; SqlConnection myCon = new SqlConnection(Settings.DSN); SqlCommand cmd = new SqlCommand(q, myCon); try { cmd.Connection.Open(); insertId = (int)cmd.ExecuteScalar(); if (insertId > 0) { MessageBox.Show(insertId.ToString()); } myCon.Close(); } catch (Exception ex) { this.error = ex.Message; retour = false; } return retour; } 

您应该更改INSERT以立即返回插入的ID(在OUTPUT子句中)! 这适用于SQL Server 2005 – 在SQL Server 2000或更早版本中不提供OUTPUT子句(您没有指定在您的问题中使用的SQL Server 版本 …)。 阅读有关MSDN联机丛书中的OUTPUT子句的更多信息。

将插入更改为:

 INSERT INTO dbo.YourTable(Col1, Col2, ..., ColN) OUTPUT Inserted.ID VALUES(Val1, Val2, ..., ValN); 

然后当你从C#执行insert语句时,你应该能够:

 using(SqlCommand cmdInsert = new SqlCommand("INSERT.....", myCon)) { myCon.Open(); var result = cmdInsert.ExecuteScalar(); myCon.Close(); } 

并且您的result变量现在应该包含正确的,新插入的值!

尝试使用SCOPE_IDENTITY()而不是@@ IDENTITY,如果这不起作用,您可以发布表模式和正在运行的插入查询。