Para capturar un VALOR DEVUELTO (devuelto por SQL usando la sintaxis RETURN({number})) use:
cmdHeader.Parameters.Add("@ReturnValue", SqlDbType.Int, 4).Direction = ParameterDirection.ReturnValue;
Además, probablemente debería usar SCOPE_IDENTITY() en lugar de @@IDENTIDAD
Editar:
Entonces su sproc haría algo como:
DECLARE @NewId INTEGER
INSERT SomeTable(FieldA) VALUES ('Something')
SELECT @NewId = SCOPE_IDENTITY()
RETURN (@NewId)
Y su código C# para recuperar ese valor sería:
int newId = cmdHeader.Parameters[@ReturnValue].value;
Edición 2:
Bien, la pregunta original confundió el problema ya que el "valor de retorno" es algo diferente a lo que realmente está haciendo, que es devolver un conjunto de resultados de una sola columna.
Entonces, NO agregue un parámetro ReturnValue en absoluto. Simplemente use ExecuteScalar() usando su configuración original de SqlCommand como se muestra a continuación:
int newId = Convert.ToInt32(cmdHeader.ExecuteScalar());