Preventing database access after application license key has expired
If the person has a valid MS SQL Server username and password, they will be able to access the database. 

You could arrange your app so that the username/password they use for the app won't allow them to accesss the SQL Server database. In any case, what's the problem if your users wish to use Crystal (or whatever) to access what is, after all, their own data? 

What I mean is that surely your app provides some extra service (for which they are paying you) - after that, what they do with their data is their business. 

You could warn them that any modifications to data may invalidate/corrupt their data with respect to your application (i.e. you won't support them for that), but personally, I would be rather annoyed to be told by a vendor that I couldn't run ad-hoc reports against my own data!

[EDIT]

What you could do is keep any user whose privileges allow them to modify the data "secret", but give them a username/password with SELECT privileges and that way everybody's happy - they have access to their data and you can rest easy in the knowledge that users can't mess up your app.