Ihr unmittelbares Problem ist wahrscheinlich entweder eine falsche Verbindungszeichenfolge oder der Datenbankserver ist nicht verfügbar. Die Verbindungszeichenfolge sollte in etwa so aussehen
Server=localhost;Database=testdb;Uid=<username>;Pwd=<password>;
mit <username>
und <password>
durch Ihre tatsächlichen Werte ersetzt.
Abgesehen davon hat Ihr Code mehrere Probleme und Sie sollten sich diese unbedingt ansehen, wenn dies beabsichtigt ist, Produktionscode zu werden, und wahrscheinlich sogar, wenn dies nur ein Spielzeugprojekt ist, um etwas zu lernen. Die Liste ist in einer bestimmten Reihenfolge und möglicherweise nicht vollständig.
- Kodieren Sie Ihre Verbindungszeichenfolge nicht hart. Verschieben Sie es stattdessen in eine Konfigurationsdatei.
- Fügen Sie keine Klartext-Passwörter in Konfigurationsdateien oder Quellcode ein. Es gibt verschiedene Lösungen wie Windows-Authentifizierung, Zertifikate oder kennwortgeschützt durch die Windows Data Protection API .
- Entsorgen Sie
IDisposable
nicht einfach Instanzen durch Aufrufen vonIDisposable.Dispose()
. Verwenden Sie stattdessen denusing
Anweisung, Ressourcen auch im Ausnahmefall freizugeben. - Erstellen Sie keine SQL-Anweisungen mit String-Manipulationstechniken. Verwenden Sie stattdessen
SqlParameter
um SQL-Injection-Angriffe zu verhindern. - Speichern Sie keine Klartext-Passwörter in einer Datenbank. Speichern Sie stattdessen zumindest gesalzene Hashes der Passwörter und verwenden Sie eine langsame Hash-Funktion, nicht MD5 oder ein Mitglied der SHA-Familie.
- Sie können
IDbCommand.ExecuteScalar
um ein skalares Ergebnis abzurufen und die Verwendung eines Datenlesegeräts zu vermeiden. - Einen booleschen Wert mit
true
vergleichen oderfalse
ist überflüssig und fügt Ihrem Code nur Rauschen hinzu. Stattif (reader.IsDBNull(0) == true)
Sie können einfachif (reader.IsDBNull(0))
verwenden . Dasselbe gilt fürif (reader.Read() != false)
was äquivalent zuif (reader.Read() == true)
ist und damit auchif (reader.Read())
. - Verwendung eines O/R-Mappers wie Entity Framework wird normalerweise der Interaktion mit der Datenbank auf der Ebene von SQL-Befehlen vorgezogen.