Otimização de execução e passagem de parâmetros

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 retornada
  • DBNull.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çãoValorDescrição
Input1Padrão, parâmetro de entrada (passa valores para o SQL)
Output2Parâmetro de saída, recebe valores após execução de procedure armazenada
InputOutput3Aceita 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

  1. Não concatene strings para montar SQL, sempre utilize SqlParameter para parametrização;
  2. Para todos os objetos SqlConnection e SqlCommand, dê preferência ao bloco using para liberação automática de recursos;
  3. Ao usar ExecuteScalar, faça sempre a dupla verificação de null + DBNull.Value;
  4. Diferencie CommandTimeout (tempo limite de execução SQL) e o Connect Timeout presente na string de conexão (tempo limite para estabelecer conexão).

Otimização de execução e passagem de parâmetros

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *