This might sound quite mean, but I had one just like this and after about 8 months I couldn't take it anymore... I sat him down (he was 5... but had only *just* turned 5, it started when he was 3 and 4).... Anyway - I sat down with him, just the two of us, and told him this (in not so many words)
Declan, I love you. And I want you to come to me when you need things. And from now on, when you need something, you will need to use your big boy voice so I can understand what you're saying. Okay?
Of course, he says okay and everything was great for... oh, about 15 minutes.
As soon as the whining started back up again, I reminded him of our talk. All I said was, "Remember, you need to use your big boy voice now." And ignored him until he did.
I mean totally ignored him. No eye contact, no talking to him, no yelling at him, no time outs, not reward chart reminders... etc...
It worked for mine - maybe try it for yours? I have no idea if it would work or not - obviously we have two different kids so it might not, but thats what I did and it only took a week and that whining stopped and the world rejoiced!!