The reason why the proposed solutions don't work is very simple - the command line length gets in the way. Basically, xargs fails to group all the input file names within a single command line. Which is OK, by the way.
One thing you may want to try is to update the archive instead of creating it, like this:
find . -name '*.dat' -print | xargs tar uf tarfile.tar
If your specific version of tar does not support updating an inexistent archive, or you don't delete or move the target archive after processing, you may want to prepend the command line above with this:
tar cf tarfile.tar
The command line above will create an empty archive without any objects in it -- just a header, really. So, the whole command line would look like the following:
tar cf tarfile.tar; find . -name '*.dat' -print | xargs tar uf tarfile.tar
Also you may want to explore vendor-specific command line parameters for your tar. Some vendors provide means to get a list of objects for archiving from an external file (e.g. -L for AIX tar). But it won't be portable and using those options is rather cumbersome.