Váš bezprostřední problém je pravděpodobně buď nesprávný připojovací řetězec, nebo databázový server není dostupný. Připojovací řetězec by měl být něco takového
Server=localhost;Database=testdb;Uid=<username>;Pwd=<password>;
s <username>
a <password>
nahrazeny vašimi skutečnými hodnotami.
Kromě toho má váš kód několik problémů a měli byste se na ně určitě podívat, pokud se má stát produkčním kódem, a pravděpodobně i když je to jen hračka, abyste se něco naučili. Seznam je v určitém pořadí a nemusí být úplný.
- Nekódujte svůj připojovací řetězec napevno. Místo toho přesuňte do konfiguračního souboru.
- Do konfiguračních souborů nebo zdrojového kódu nezahrnujte hesla ve formátu prostého textu. Existují různá řešení, jako je ověření systému Windows, certifikáty nebo chráněno hesly pomocí Windows Data Protection API .
- Nezlikvidujte pouze
IDisposable
instance volánímIDisposable.Dispose()
. Místo toho použijteusing
prohlášení o uvolnění zdrojů i v případě výjimek. - Nevytvářejte příkazy SQL pomocí technik manipulace s řetězci. Místo toho použijte
SqlParameter
abyste zabránili útokům SQL injection. - Neuchovávejte hesla ve formátu prostého textu v databázi. Místo toho alespoň ukládejte osolené hash hesel a použijte pomalou hashovací funkci, ne MD5 nebo člen Rodina SHA.
- Můžete použít
IDbCommand.ExecuteScalar
načíst skalární výsledek a vyhnout se použití čtečky dat. - Porovnání booleovské hodnoty s hodnotou
true
nebofalse
je nadbytečný a pouze přidává šum do vašeho kódu. Místoif (reader.IsDBNull(0) == true)
stačí použítif (reader.IsDBNull(0))
. Totéž platí proif (reader.Read() != false)
co je ekvivalentníif (reader.Read() == true)
a tedy takéif (reader.Read())
. - Použití O/R mapovače, jako je Entity Framework je obvykle preferován před interakcí s databází na úrovni SQL příkazů.