1. Comprobación del estado de conexión de SqlConnection
Propiedad: conn.State
Tipo enumerado ConnectionState
// Abrir la conexión si no se encuentra abierta
if (conn.State != ConnectionState.Open)
{
conn.Open();
}Lenguaje del código: JavaScript (javascript)
Nota: al usarlo junto con
using, el estado pasa automáticamente a Closed cuando se libera la conexión.
Estados frecuentes:Open/Closed/Connecting, entre otros.
2. Punto clave: validación de valores nulos con ExecuteScalar
Revisa el valor devuelto por ExecuteScalar para evitar errores generados por valores null
object obj = sqlCom.ExecuteScalar();
// Debes comprobar tanto null como DBNull.Value
if (obj == null || obj == System.DBNull.Value)
{
MessageBox.Show("El resultado es null");
}
else
{
MessageBox.Show(obj.ToString());
}Lenguaje del código: JavaScript (javascript)
Diferencias:
null: No se devolvió ninguna fila de datosDBNull.Value: Se obtuvo una fila, pero el campo almacena un valor NULL en la base de datos
3. Sistema de parámetros de SqlCommand (medida principal contra inyección SQL)
1. Objeto principal
La colección SqlCommand.Parameters guarda múltiples parámetros SqlParameter. El uso de consultas parametrizadas elimina por completo las vulnerabilidades por inyección SQL.
2. Ejemplo de creación de parámetros
// Nombre del parámetro, tipo de dato, longitud
SqlParameter paramSql = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
// Asignar valor
paramSql.Value = model.Title;
// Agregar al objeto de comando
sqlCom.Parameters.Add(paramSql);Lenguaje del código: JavaScript (javascript)
3. Dirección del parámetro ParameterDirection (enumerado)
paramSql.Direction = ParameterDirection.Output;
| Enumerado | Valor | Descripción |
|---|---|---|
| Input | 1 | Valor por defecto, parámetro de entrada (envía valores a la sentencia SQL) |
| Output | 2 | Parámetro de salida, recupera resultados tras ejecutar un procedimiento almacenado |
| InputOutput | 3 | Acepta valores de entrada y devuelve datos después de la ejecución |
Ejemplo completo
private void button1_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=.;Initial Catalog=db;User ID=sa;Password=xxx";
using (SqlConnection conn = new SqlConnection(connectionString))
{
// Abrir conexión de forma segura
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
sqlCom.CommandTimeout = 60;
// Usa SQL parametrizado, nunca concatenes cadenas de texto
sqlCom.CommandText = "SELECT [Title] FROM [dbo].[Article] WHERE Title = @Title";
// Definir parámetro
SqlParameter paramTitle = new SqlParameter("@Title", SqlDbType.NChar, 10);
paramTitle.Value = "Título de prueba";
sqlCom.Parameters.Add(paramTitle);
object obj = sqlCom.ExecuteScalar();
if (obj == null || obj == DBNull.Value)
{
MessageBox.Show("El resultado es null");
}
else
{
MessageBox.Show(obj.ToString());
}
}
}Lenguaje del código: JavaScript (javascript)
Normas importantes de desarrollo
- Nunca concatenes cadenas para armar sentencias SQL, emplea siempre
SqlParameterpara parametrizar; - Para todos los objetos
SqlConnectionySqlCommand, prefiere el bloqueusingpara liberar recursos automáticamente; - Con ExecuteScalar haz siempre la doble comprobación de
null + DBNull.Value; - Diferencia
CommandTimeout(tiempo de espera para ejecución SQL) yConnect Timeoutdentro de la cadena de conexión (tiempo de espera para establecer la conexión).
Optimización de ejecución y envío de parámetros
Previous: CommandTimeout
Next: ExecuteNonQuery