in reply to calling all DBI wizards...

Your eval blocks are too coarsely-grained. dvergin has pointed at the reason why:

print eval { return 'Surprise!' };

You could wrap the prepare() and execute() statements in an eval block, which is much improved, and is still in the spirit of your code. You'll want to move the $@ checking, though.