.NET is extremely easy to decompile, just like Java and Flash. The reason is because VS programs are compiled to something similar to Java's Bytecode, called CIL (also called MSIL). Visual Studio even ships with a program called ILDASM that can show the CIL of a compiled .NET assembly (aka a EXE or DLL). The .NET runtime compiles assemblies to machine code as they are run, similar to Java, in a process called "Just-In-Time" compilation (aka JIT'd).
There are methods of "obfuscating" .NET code. Visual Studio comes with a community edition of
Dotfuscate, a .NET obfuscater. It is better than nothing, but if someone really wants to get into your source, they can still piece it together.
So there really are 3 options to secure your application. First is to use Dotfuscate or another obfuscater. Of course that is not 100%, but it will keep most of the riffraffs out. Second is to keep the source out of your user's hands by making it an ASP.NET application. You can use Silverlight for any rich client-side interaction you may need, and that way the database would only be manipulated on the web server. Third, and the option I know the least about, is to pre-compile your EXE's and DLL's. Supposedly there are some products out there (none that I know of that come with VS that work on non-ASP.NET) that will trick the .NET runtime into JIT'ing your code to various end platforms. The downside to this would be you would have to compile different versions for each different platform (Windows XP 32-bit, Vista 64-bit, Intel processor, AMD, etc.). The .NET runtime creates highly optimized machine code that is specifically tailored to each platform. If you do go this route, it will create machine code that is basically impossible to decompile.