It works this way because:
1. ParamByName automatically prepares a query when it is called, if the query has not already been prepared.
2. Updating the SQL property (the query) automatically unprepares a query on the grounds that it cannot tell the difference between a radical change and a minor addition.
3. Unpreparing a query clears the params property on the grounds that the parameter set is unpredictable when the query is re-prepared.
I doubt whether it would be worth the complexity of trying to retain parameter values across a query unprepare/prepare. For example, the update query may change the type of the parameter. Your strategy should be to set the SQL and then set the parameter values.