What I have been using is just the simplest of all, though it probably depends on how your app connects the database...but I have my app fetch the data using a stored proc, and then set the dataset of the report to the dataset my app just returned. I know, it what everyone does.
when you get your dataset, stop the app and have the dataset write an XML file with the structure, make the file's extension xsd. Now open Crystal and create a new connection for ado.net (xml) and point it to the file just written...poof, if will have the sample data that you just ran as well as the structure. Crystal is now independant from the connection to the data source, it doesn't care about connecting and getting the data, just validating that the data it 'got' matches what it expects.
This is the push method instead of the pull method for Crystal.
HTH