SqlDataAdapter

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.SelectCommandadapter.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()
  1. Apertura y cierre automático de conexión: Si al invocar Fill la 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.

  1. Fill(ds, "NombreTabla"): Asigna un nombre a la DataTable cargada en memoria para buscarla por nombre. Si no lo indicas, el nombre por defecto es Table.
  2. Cuando el procedimiento almacenado devuelve varios conjuntos de resultados, Fill crea varias DataTable de forma automática: ds.Tables[0]、ds.Tables[1]...
Comparación principal: DataSet frente a SqlDataReader
ObjetoModoUso de conexiónCasos de uso
SqlDataReaderLectura conectada en flujoMantiene ocupada la conexión de base de datosVolúmenes grandes de datos, sin necesidad de cache completo, procesamiento fila a fila
DataSet(DataAdapter)Caché en memoria desconectadoLibera la conexión justo después de FillEnlace 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *