1. Verificação do estado da conexão SqlConnection
Propriedade: conn.State
Tipo enumeração ConnectionState
// Abre a conexão caso ela ainda não esteja aberta
if (conn.State != ConnectionState.Open)
{
conn.Open();
}Code language: JavaScript (javascript)
Aviso: quando utilizado com o bloco
using, o estado muda automaticamente para Closed após o descarte da conexão.
Estados comuns:Open/Closed/Connecting, entre outros.
2. Ponto importante: validação de valores nulos no ExecuteScalar
Verifique o valor retornado pelo ExecuteScalar para evitar erros causados por valores null
object obj = sqlCom.ExecuteScalar();
// É necessário verificar tanto null quanto DBNull.Value
if (obj == null || obj == System.DBNull.Value)
{
MessageBox.Show("O resultado é null");
}
else
{
MessageBox.Show(obj.ToString());
}Code language: JavaScript (javascript)
Diferenças:
null: Nenhuma linha de dado foi retornadaDBNull.Value: Uma linha foi encontrada, mas o campo contém o valor NULL no banco de dados
3. Sistema de parâmetros do SqlCommand (principal defesa contra injeção SQL)
1. Objeto principal
A coleção SqlCommand.Parameters armazena vários parâmetros do tipo SqlParameter. Usar consultas parametrizadas elimina completamente riscos de injeção SQL.
2. Exemplo de criação de parâmetros
// Nome do parâmetro, tipo de dado, tamanho
SqlParameter paramSql = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
// Atribuir valor
paramSql.Value = model.Title;
// Adicionar ao objeto de comando
sqlCom.Parameters.Add(paramSql);Code language: JavaScript (javascript)
3. Direção do parâmetro ParameterDirection (enumeração)
paramSql.Direction = ParameterDirection.Output;
| Enumeração | Valor | Descrição |
|---|---|---|
| Input | 1 | Padrão, parâmetro de entrada (passa valores para o SQL) |
| Output | 2 | Parâmetro de saída, recebe valores após execução de procedure armazenada |
| InputOutput | 3 | Aceita entrada e também retorna saída após execução |
Exemplo 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))
{
// Abre conexão de maneira segura
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
sqlCom.CommandTimeout = 60;
// Sempre use SQL parametrizado, nunca concatene strings!
sqlCom.CommandText = "SELECT [Title] FROM [dbo].[Article] WHERE Title = @Title";
// Monta o parâmetro
SqlParameter paramTitle = new SqlParameter("@Title", SqlDbType.NChar, 10);
paramTitle.Value = "Título de teste";
sqlCom.Parameters.Add(paramTitle);
object obj = sqlCom.ExecuteScalar();
if (obj == null || obj == DBNull.Value)
{
MessageBox.Show("O resultado é null");
}
else
{
MessageBox.Show(obj.ToString());
}
}
}Code language: JavaScript (javascript)
Regras importantes de desenvolvimento
- Não concatene strings para montar SQL, sempre utilize
SqlParameterpara parametrização; - Para todos os objetos
SqlConnectioneSqlCommand, dê preferência ao blocousingpara liberação automática de recursos; - Ao usar ExecuteScalar, faça sempre a dupla verificação de
null + DBNull.Value; - Diferencie
CommandTimeout(tempo limite de execução SQL) e oConnect Timeoutpresente na string de conexão (tempo limite para estabelecer conexão).
Otimização de execução e passagem de parâmetros
Previous: CommandTimeout
Next: ExecuteNonQuery