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.SelectCommand → adapter.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()
- Abertura e fechamento automático da conexão: Se na chamada do
Filla 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.
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.- Quando o procedimento armazenado retorna vários conjuntos de resultados, o
Fillcria automaticamente múltiplas DataTable:ds.Tables[0]、ds.Tables[1]...
Comparação principal: DataSet vs SqlDataReader
| Objeto | Modo | Ocupação da conexão | Cenários de uso |
|---|---|---|---|
| SqlDataReader | Leitura de fluxo conectada | Mantém a conexão com banco ocupada | Grandes volumes de dados, sem necessidade de cache completo, processamento linha‑a‑linha |
| DataSet(DataAdapter) | Cache em memória offline | Libera conexão logo após o Fill | Vinculaçã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