Since you don’t want to show your blend, I can’t say what you did wrong. --Nobody can.
Any way, here is what I did right…
I made a (quick) fish from a deformed sphere. I added a Bezier curve from head to tail and hooked each end of the curve to an empty. (Use [CTRL H] in Edit mode.) In Object mode, I added a Curve modifier to the sphere/fish. I fixed the axis. Then I edited the curve again to fix its tilt (in the [N] panel) so that my fish appears untouched.
And it just worked as seen on the copy at the bottom of the snapshot. I just need to rotate and move the empty at the tail to make my fish swim… without moving. To make it move as well, I’d just parent the fish and the tail’s empty to the head’s empty so that if I launch the head’s empty on a trajectory (a curve of example), everything follows.
Edit: I just tested before to post and I wish to add that it’s not a good idea to use an empty as head’s hook. A regular object gives you better control when you animate it on a curve.
The things that I did right, I think: The fish and the curve have the same origin and since I didn’t alter them in any way in Object mode, their scales are 1x1x1 and don’t need to be applied.
So, to fix your scene, check the origins, the axes, the tilt and the scales. That’s all I can think of without actually seeing your blend.