2012-09-05 86 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兼容性這麼久,我忘記了該功能已被引入。 –