SqlDataAdapter

C# ADO.NET: Preencher DataSet chamando procedimento armazenado com SqlDataAdapter

Na seção anterior usamos o SqlDataReader para leitura de fluxo somente leitura e progressiva. Nesta seção utilizamos o SqlDataAdapter para carregar de uma vez os resultados do procedimento armazenado em um DataSet (tabela de dados offline na memória). É muito comum usá‑lo para vincular diretamente controles como o DataGridView.
SqlCommand (definir procedimento armazenado) → SqlDataAdapter.SelectCommandadapter.Fill(DataSet) busca os dados automaticamente

Exemplo

string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();

    SqlCommand sqlCom = new SqlCommand();
    sqlCom.Connection = conn;
    sqlCom.CommandText = "myProc";
    // Define que vamos executar um procedimento armazenado
    sqlCom.CommandType = CommandType.StoredProcedure;

    // Enviar parâmetros de entrada para o procedimento armazenado
    SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
    param.Value = 4;
    param.Direction = ParameterDirection.Input;
    sqlCom.Parameters.Add(param);

    // Adaptador de dados
    SqlDataAdapter sqlDA = new SqlDataAdapter();
    sqlDA.SelectCommand = sqlCom;

    DataSet ds = new DataSet();
    // Preencher dados, segundo parâmetro é o nome da tabela interna do DataSet
    sqlDA.Fill(ds, "sdfdsf");

    // Vincular controle de grade do WinForms
    this.dataGridView1.DataSource = ds.Tables[0];
}Code language: C# (cs)

Exemplo mais adequado

string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
    string procName = "myProc";
    using (SqlCommand sqlCom = new SqlCommand(procName, conn))
    {
        sqlCom.CommandType = CommandType.StoredProcedure;
        // Forma simplificada de declarar parâmetros
        sqlCom.Parameters.Add("@id", SqlDbType.Int).Value = 4;

        SqlDataAdapter sqlDA = new SqlDataAdapter(sqlCom);
        DataSet ds = new DataSet();
        // Carregar resultados, alias de tabela ArticleResult
        sqlDA.Fill(ds, "ArticleResult");

        // Vincular controle
        dataGridView1.DataSource = ds.Tables["ArticleResult"];
        // Também é possível acessar por índice: ds.Tables[0]
    }
}Code language: JavaScript (javascript)

Análise

Características do SqlDataAdapter.Fill()
  1. Abertura e fechamento automático da conexão: Se na chamada do Fill a conexão não estiver aberta com Open(), o adaptador abre ela sozinho e fecha ao término da execução;

No código‑exemplo chamamos conn.Open() manualmente. Essa forma funciona, mas não é obrigatória.

  1. Fill(ds, "NomeDaTabela"): Define um nome para a DataTable carregada na memória para buscas por nome. Se não informar, o nome padrão será Table.
  2. Quando o procedimento armazenado retorna vários conjuntos de resultados, o Fill cria automaticamente múltiplas DataTable: ds.Tables[0]、ds.Tables[1]...
Comparação principal: DataSet vs SqlDataReader
ObjetoModoOcupação da conexãoCenários de uso
SqlDataReaderLeitura de fluxo conectadaMantém a conexão com banco ocupadaGrandes volumes de dados, sem necessidade de cache completo, processamento linha‑a‑linha
DataSet(DataAdapter)Cache em memória offlineLibera conexão logo após o FillVinculação de controles UI, conjuntos pequenos de dados, leituras repetidas

Configuração obrigatória para executar procedimento armazenado

sqlCom.CommandType = CommandType.StoredProcedure;

Sem essa linha, o ADO.NET interpreta myProc como um texto SQL comum e dispara um erro.

Vinculação de controles

dataGridView1.DataSource = ds.Tables[0];

O controle WinForms DataGridView aceita vinculação direta com DataTable e gera colunas automaticamente.
Se depois for preciso alterar dados e gravar no banco de dados, você pode combinar com SqlDataAdapter.Update() para fazer atualizações em lote.

Sem abrir conexão manualmente

using(SqlConnection conn=new SqlConnection(connectionString))
using(SqlCommand cmd=new SqlCommand("myProc",conn))
{
    cmd.CommandType=CommandType.StoredProcedure;
    cmd.Parameters.Add("@id",SqlDbType.Int).Value=4;
    SqlDataAdapter da=new SqlDataAdapter(cmd);
    DataSet ds=new DataSet();
    da.Fill(ds,"Article"); // Abre e fecha conexão de forma automática
}Code language: JavaScript (javascript)

Esse exemplo usa as instruções using para gerenciar a conexão

SqlDataAdapter

Deixe um comentário

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