Вашият непосредствен проблем вероятно е или неправилен низ за връзка, или сървърът на базата данни не е наличен. Низът за връзка трябва да бъде нещо подобно
Server=localhost;Database=testdb;Uid=<username>;Pwd=<password>;
с <username> и <password> заменени с вашите действителни стойности.
Освен това вашият код има няколко проблема и определено трябва да ги разгледате, ако това е предназначено да стане производствен код и вероятно дори ако това е просто проект за играчка, за да научите нещо. Списъкът е в определен ред и може да не е изчерпателен.
- Не кодирайте твърдо своя низ за връзка. Вместо това го преместете в конфигурационен файл.
- Не включвайте обикновени текстови пароли в конфигурационните файлове или изходния код. Има различни решения като удостоверяване на Windows, сертификати или защитени с пароли от API за защита на данните на Windows .
- Не изхвърляйте просто
IDisposableекземпляри чрез извикване наIDisposable.Dispose(). Вместо това използвайтеusingизявление за освобождаване на ресурси дори в случай на изключения. - Не създавайте SQL изрази с помощта на техники за манипулиране на низове. Вместо това използвайте
SqlParameterза предотвратяване на атаки с инжектиране на SQL. - Не съхранявайте пароли с обикновен текст в база данни. Вместо това поне съхранявайте солени хешове на паролите и използвайте бавна хеш функция, а не MD5 или член на SHA семейство.
- Можете да използвате
IDbCommand.ExecuteScalarза да извлечете скаларен резултат и да избегнете използването на четец на данни. - Сравняване на булева стойност с
trueилиfalseе излишен и просто добавя шум към вашия код. Вместоif (reader.IsDBNull(0) == true)можете просто да използватеif (reader.IsDBNull(0)). Същото важи и заif (reader.Read() != false)какво е еквивалентно наif (reader.Read() == true)и следователно същоif (reader.Read()). - Използване на O/R картограф като Entity Framework обикновено се предпочита пред взаимодействието с базата данни на ниво SQL команди.