Su problema inmediato es probablemente una cadena de conexión incorrecta o el servidor de la base de datos no está disponible. La cadena de conexión debería ser algo como esto
Server=localhost;Database=testdb;Uid=<username>;Pwd=<password>;
con <username> y <password> reemplazado con sus valores reales.
Además de eso, su código tiene varios problemas y definitivamente debería analizarlos si está destinado a convertirse en código de producción y probablemente incluso si se trata solo de un proyecto de juguete para aprender algo. La lista está en un orden particular y puede no ser exhaustiva.
- No codifique de forma rígida su cadena de conexión. En su lugar, muévalo a un archivo de configuración.
- No incluya contraseñas de texto sin formato en los archivos de configuración ni en el código fuente. Hay varias soluciones como autenticación de Windows, certificados o contraseñas protegidas por la API de protección de datos de Windows .
- No se limite a desechar
IDisposableinstancias llamando aIDisposable.Dispose(). En su lugar, useusingdeclaración para liberar recursos incluso en el caso de excepciones. - No cree sentencias SQL utilizando técnicas de manipulación de cadenas. En su lugar, use
SqlParameterpara prevenir ataques de inyección SQL. - No almacene contraseñas de texto sin formato en una base de datos. En su lugar, al menos almacene hashes salteados de las contraseñas y use una función hash lenta, no MD5 o un miembro de la Familia SHA.
- Puede usar
IDbCommand.ExecuteScalarpara recuperar un resultado escalar y evitar el uso de un lector de datos. - Comparar un valor booleano con
trueofalsees redundante y solo agrega ruido a su código. En lugar deif (reader.IsDBNull(0) == true)simplemente puede usarif (reader.IsDBNull(0)). Lo mismo vale paraif (reader.Read() != false)lo que es equivalente aif (reader.Read() == true)y por lo tanto tambiénif (reader.Read()). - Utilizar un mapeador O/R como Entity Framework generalmente se prefiere interactuar con la base de datos en el nivel de los comandos SQL.