Io provo a risponderTi :

1 - Ma io penso per una completa divisione tra Codice e Interfaccia. Inoltre se la classe implementa iDisposable risulta piu' pulito pulire il Garbage Collector

2 - Certo perchè non occupi il traffico di rete, primis e secondo fai lavorare il client e non il server. Ma per me è sbagliato perchè MSDN dice e non consiglia di usare le Stored Procedure per fare cio' ...

3 - Io personalmente uso una Classe che è Inherits della Connection e nella New la Apro e nella Dispose la Chiudo. Inoltre implemento il DataReader che se la chiude da solo quando ha finito di leggere i dati.

4 - Sicuramente è dispersivo e inutile usare select ed if, se hai un valore Costante usi o le costanti private o le enumerazioni