Seu problema imediato é provavelmente uma cadeia de conexão incorreta ou o servidor de banco de dados não está disponível. A string de conexão deve ser algo assim
Server=localhost;Database=testdb;Uid=<username>;Pwd=<password>;
com
<username>
e <password>
substituído por seus valores reais. Além disso, seu código tem vários problemas e você definitivamente deve analisá-los se isso for destinado a se tornar código de produção e provavelmente até mesmo se for apenas um projeto de brinquedo para aprender algo. A lista está em ordem particular e pode não ser abrangente.
- Não codifique sua string de conexão. Em vez disso, mova-o para um arquivo de configuração.
- Não inclua senhas de texto simples em arquivos de configuração ou código-fonte. Existem várias soluções como autenticação do Windows, certificados ou senhas protegidas pela API de proteção de dados do Windows .
- Não descarte apenas
IDisposable
instâncias chamandoIDisposable.Dispose()
. Em vez disso, useusing
declaração para liberar recursos mesmo no caso de exceções. - Não crie instruções SQL usando técnicas de manipulação de strings. Em vez disso, use
SqlParameter
para evitar ataques de injeção de SQL. - Não armazene senhas de texto simples em um banco de dados. Em vez disso, pelo menos, armazene hashes salgados das senhas e use uma função de hash lenta, não MD5 ou um membro do Família SHA.
- Você pode usar
IDbCommand.ExecuteScalar
para recuperar um resultado escalar e evitar o uso de um leitor de dados. - Comparando um valor booleano com
true
oufalse
é redundante e apenas adiciona ruído ao seu código. Em vez deif (reader.IsDBNull(0) == true)
você pode simplesmente usarif (reader.IsDBNull(0))
. O mesmo vale paraif (reader.Read() != false)
o que é equivalente aif (reader.Read() == true)
e, portanto, tambémif (reader.Read())
. - Usando um mapeador O/R como o Entity Framework geralmente é preferível a interagir com o banco de dados no nível de comandos SQL.