1) Do not hard code connection strings: it will always come back to bite you later. Always use a configuration file to store them. That way you can change them as necessary when you release code to other people.
2) Always treat connection, command and suchlike objects as scarce resources and Dispose of them when you are finished with them. A
using
block is the simplest way to do this as it automatically calls Dispose whenteh object goes out of scope.
3) Never concatenate strings to build a SQL command. It leaves you wide open to accidental or deliberate SQL Injection attack which can destroy your entire database. Use Parametrized queries instead.
When you concatenate strings, you cause problems because SQL receives commands like:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
The quote the user added terminates the string as far as SQL is concerned and you get problems. But it could be worse. If I come along and type this instead: "x';DROP TABLE MyTable;--" Then SQL receives a very different command:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;
Which SQL sees as three separate commands:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
A perfectly valid SELECT
DROP TABLE MyTable;
A perfectly valid "delete the table" command
And everything else is a comment.
So it does: selects any matching rows, deletes the table from the DB, and ignores anything else.
So ALWAYS use parameterized queries! Or be prepared to restore your DB from backup frequently. You do take backups regularly, don't you?
4) Never swallow exceptions - it means that the essential data you need to fix the problem is thrown away - that means never using this:
catch(Exception)
because you have no access to what the exception was, and the message which tells you why the system failed. Instead, use this:
catch(Excpetion ex)
and use logging or even a MessageBox to display the error message the Exception object contains. That way, you get to find out what the problem is, and can fix it...