Il tuo problema immediato è probabilmente una stringa di connessione errata o il server del database non è disponibile. La stringa di connessione dovrebbe essere qualcosa del genere
Server=localhost;Database=testdb;Uid=<username>;Pwd=<password>;
con <username>
e <password>
sostituiti con i tuoi valori effettivi.
Oltre a ciò il tuo codice ha diversi problemi e dovresti assolutamente esaminarli se questo è destinato a diventare codice di produzione e probabilmente anche se questo è solo un progetto giocattolo per imparare qualcosa. L'elenco è in ordine particolare e potrebbe non essere completo.
- Non codificare la stringa di connessione. Invece spostarlo in un file di configurazione.
- Non includere password in testo normale nei file di configurazione o nel codice sorgente. Esistono varie soluzioni come autenticazione di Windows, certificati o protetto da password dall'API di protezione dei dati di Windows .
- Non smaltire semplicemente
IDisposable
istanze chiamandoIDisposable.Dispose()
. Utilizza inveceusing
dichiarazione per liberare risorse anche in caso di eccezioni. - Non creare istruzioni SQL utilizzando tecniche di manipolazione delle stringhe. Utilizza invece
SqlParameter
per prevenire attacchi SQL injection. - Non memorizzare le password in testo normale in un database. Invece almeno archiviare gli hash salati delle password e utilizzare una funzione di hash lenta, non MD5 o un membro del Famiglia SHA.
- Puoi utilizzare
IDbCommand.ExecuteScalar
per recuperare un risultato scalare ed evitare di utilizzare un lettore di dati. - Confronto di un valore booleano con
true
ofalse
è ridondante e aggiunge solo rumore al tuo codice. Invece diif (reader.IsDBNull(0) == true)
puoi semplicemente usareif (reader.IsDBNull(0))
. Lo stesso vale perif (reader.Read() != false)
cosa equivale aif (reader.Read() == true)
e quindi ancheif (reader.Read())
. - Utilizzo di un mappatore O/R come Entity Framework di solito è preferito all'interazione con il database a livello di comandi SQL.