Вашият непосредствен проблем вероятно е или неправилен низ за връзка, или сървърът на базата данни не е наличен. Низът за връзка трябва да бъде нещо подобно
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 команди.