2012-09-05 51 views
1

我无法从SQL Server获取返回值与它刚刚更新的行的ID。ExecuteScalar在SQL Server行更新

我想获得我刚刚更新以在下面的查询中使用的行的id,但是当我执行此方法时,第一个T-SQL语句更新该行,但对象activeRecord未获取返回的行号(没有值)

如果我直接在SQL中运行T-SQL语句,我会得到一个返回值。我在代码中的其他地方使用了ExecuteScalar,没有问题。

我在这里错过了什么?

if (Regex.IsMatch(Encoding.ASCII.GetString(udpMessageReceived), "Valitating")) 
{ 
    //a device is validating itself following endpoint registration 
    string[] splitaction = Encoding.ASCII.GetString(udpMessageReceived).Split(deliminator); 

    using (var conn = new SqlConnection(Globals.ConnectionString)) 
    { 
     conn.Open(); 
     object activeRecord; 

     using (var comm = new SqlCommand("UPDATE oView_MachineRegister SET validated= 1 where hostname= @hostname; SELECT ID = SCOPE_IDENTITY()", conn)) 
     { 
      comm.Parameters.AddWithValue("datenow", DateTime.Now); 
      comm.Parameters.AddWithValue("hostname", splitaction[1]); 

      activeRecord = comm.ExecuteScalar(); 
     } 

     using (var comm2 = new SqlCommand("DELETE from oView_OutBoundMessageQ WHERE machines = @activerecord AND command = 'Validate'", conn)) 
     { 
      comm2.Parameters.AddWithValue("activerecord", activeRecord); 
      comm2.ExecuteNonQuery(); 
     } 

     conn.Close(); 
    } 
} 
+0

没有,还是没有回报 – Damo

+2

SCOPE_IDENTITY是在最后插入同样的范围。做一个选择语句以按日期和主机获取密钥,然后将其用于更新并返回。 –

+0

@TonyHopkinson谢谢,我没有意识到scope_identity只有最后一个插入。我以前只使用它插入以前 – Damo

回答

3

发现SQL: Update a row and returning a column value with 1 query

的回答改变了查询:

UPDATE oView_MachineRegister SET validated = 1 OUTPUT INSERTED.id WHERE hostname = @hostname 

现在返回最后更新的ID

+0

有一个加号,我一直不得不维持sql 2000兼容性这么久,我忘记了该功能已被引入。 –