1

更新したばかりの行のIDを使用してSQLServerから戻り値を取得するのに問題があります。

次のクエリで使用するために更新したばかりの行の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();
    }
}
4

1 に答える 1

4

SQLで答えが見つかりました:1つのクエリで行を更新して列の値を返す

クエリを次のように変更しました。

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

これで、最後に更新されたIDが返されます

于 2012-09-05T21:46:08.850 に答える