I think you are missing the assigning the update command from the commandbuilder to the dataadapter.
da.UpdateCommand = cb.GetUpdateCommand();
at least that is how I recall it needing to be done, you would think it would assign it automatically since your passing the dataadapter as a parameter, but if my memory serves me correctly you have to apply any of the commands you want from the commandbuilder.