C# ADO.NET: Llenar DataSet llamando a un procedimiento almacenado con SqlDataAdapter
En la sección anterior usamos SqlDataReader para una lectura secuencial de solo lectura. En esta parte empleamos SqlDataAdapter para cargar de una vez todos los resultados del procedimiento almacenado dentro de un DataSet (tabla de datos fuera de conexión en memoria). Se usa habitualmente para enlazar directamente controles como DataGridView.SqlCommand (definir procedimiento almacenado) → SqlDataAdapter.SelectCommand → adapter.Fill(DataSet) obtiene los datos de forma automática
Ejemplo
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";
// Indicamos que se ejecuta un procedimiento almacenado
sqlCom.CommandType = CommandType.StoredProcedure;
// Pasamos parámetros de entrada al procedimiento almacenado
SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
param.Value = 4;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
// Adaptador de datos
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = sqlCom;
DataSet ds = new DataSet();
// Cargar datos, el segundo parámetro define el nombre de la tabla interna del DataSet
sqlDA.Fill(ds, "sdfdsf");
// Enlazar control de tabla WinForms
this.dataGridView1.DataSource = ds.Tables[0];
}Lenguaje del código: C# (cs)
Ejemplo más recomendado
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 abreviada para definir parámetros
sqlCom.Parameters.Add("@id", SqlDbType.Int).Value = 4;
SqlDataAdapter sqlDA = new SqlDataAdapter(sqlCom);
DataSet ds = new DataSet();
// Cargar resultados, alias de tabla ArticleResult
sqlDA.Fill(ds, "ArticleResult");
// Enlazar control
dataGridView1.DataSource = ds.Tables["ArticleResult"];
// También se puede acceder por índice: ds.Tables[0]
}
}Lenguaje del código: JavaScript (javascript)
Explicación
Características de SqlDataAdapter.Fill()
- Apertura y cierre automático de conexión: Si al invocar
Fillla conexión no se ha abierto con Open(), el adaptador la abre automáticamente y la cierra al finalizar;
En el código de ejemplo se llama manualmente a
conn.Open(). Funciona, pero no es obligatorio.
Fill(ds, "NombreTabla"): Asigna un nombre a la DataTable cargada en memoria para buscarla por nombre. Si no lo indicas, el nombre por defecto esTable.- Cuando el procedimiento almacenado devuelve varios conjuntos de resultados,
Fillcrea varias DataTable de forma automática:ds.Tables[0]、ds.Tables[1]...
Comparación principal: DataSet frente a SqlDataReader
| Objeto | Modo | Uso de conexión | Casos de uso |
|---|---|---|---|
| SqlDataReader | Lectura conectada en flujo | Mantiene ocupada la conexión de base de datos | Volúmenes grandes de datos, sin necesidad de cache completo, procesamiento fila a fila |
| DataSet(DataAdapter) | Caché en memoria desconectado | Libera la conexión justo después de Fill | Enlace de controles UI, conjuntos de datos pequeños, lecturas repetidas |
Configuración obligatoria para ejecutar procedimiento almacenado
sqlCom.CommandType = CommandType.StoredProcedure;
Si omites esta línea, ADO.NET interpreta myProc como texto SQL normal y lanza un error directamente.
Enlace de controles
dataGridView1.DataSource = ds.Tables[0];
El control WinForms DataGridView admite el enlace directo con DataTable y genera columnas automáticamente.
Si más tarde debes modificar datos y guardarlos en base de datos, puedes usar SqlDataAdapter.Update() para realizar actualizaciones por lotes.
Sin apertura manual de conexión
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 y cierra conexión automáticamente
}Lenguaje del código: JavaScript (javascript)
Este ejemplo usa sentencias using para gestionar la conexión
SqlDataAdapter