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
IDisposable
instancias llamando aIDisposable.Dispose()
. En su lugar, useusing
declaració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
SqlParameter
para 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.ExecuteScalar
para recuperar un resultado escalar y evitar el uso de un lector de datos. - Comparar un valor booleano con
true
ofalse
es 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.