Ditt omedelbara problem är förmodligen antingen en felaktig anslutningssträng eller så är databasservern inte tillgänglig. Anslutningssträngen bör vara ungefär så här
Server=localhost;Database=testdb;Uid=<username>;Pwd=<password>;
med
Förutom att din kod har flera problem och du bör definitivt undersöka dem om detta är tänkt att bli produktionskod och förmodligen även om detta bara är ett leksaksprojekt för att lära dig något. Listan är i särskild ordning och kanske inte är heltäckande.
- Hårdkoda inte din anslutningssträng. Flytta den istället till en konfigurationsfil.
- Inkludera inte lösenord i vanlig text i konfigurationsfiler eller källkod. Det finns olika lösningar som Windows-autentisering, certifikat eller lösenordsskyddade av Windows Data Protection API .
- Släng inte bara
ID-disposable
instanser genom att anropaIDisposable.Dispose()
. Använd iställetusing
uttalande för att frigöra resurser även vid undantag. - Skapa inte SQL-satser med strängmanipuleringstekniker. Använd istället
SqlParameter
för att förhindra SQL-injektionsattacker. - Lagra inte oformaterade lösenord i en databas. Förvara åtminstone saltade hash av lösenorden och använd en långsam hashfunktion, inte MD5 eller en medlem av SHA-familjen.
- Du kan använda
IDbCommand. ExecuteScalar
för att hämta ett skalärt resultat och undvika att använda en dataläsare. - Jämföra ett booleskt värde med
true
ellerfalse
är redundant och lägger bara till brus till din kod. Istället förif (reader.IsDBNull(0) ==true)
du kan bara användaif (reader.IsDBNull(0))
. Detsamma gäller förif (reader.Read() !=false)
vad som motsvararif (reader.Read() ==true)
och därför ävenif (reader.Read())
. - Använda en O/R-mappare som Entity Framework är vanligtvis att föredra framför interaktion med databasen på nivå med SQL-kommandon.