[Update 11-Aug-2012:  Si quiere saber mas sobre la arquitectura en la que esta basado el DataSet/DbDataAdapter puede ver el siguiente post: Are Typed DataSets dead? Si quiere saber mas sobre optimizar el llenado de los DataSet sin DbDataAdapter puede visitar el siguiente post: Filling a DataSet with the Data Application Block]

Hola a todos,

Un lector del blog me hace la siguiente pregunta:

en que casos se debe usar un SqlCommand o un SqlDataAdapter;  Solo con el SqlDataAdapter pude hacer una consulta general

Un SqlCommand se utiliza cuando necesitas ejecutar un tipo de sentencia Sql a la base de datos (los tipos pueden ser: Delete, Update, Insert o Select). Por su parte el SqlDataAdapter se utiliza si requieres ejecutar más de un tipo de sentencia Sql o si trabajarás en escenarios desconectados.

Ejemplo de SqlCommand:

        public List Listar()
        {
            SqlConnection con = new SqlConnection(cadenaConexion);
            SqlCommand com = new SqlCommand("LISTAR_CAMPANAS", con);
            com.CommandType = System.Data.CommandType.StoredProcedure;

            con.Open();

            SqlDataReader drCampanas = com.ExecuteReader();
            List listaCampanas = new List();

            while (drCampanas.Read())
            {
                listaCampanas.Add(Cargar(drCampanas));
            }

            drCampanas.Close();
            con.Close();
            return listaCampanas;
        }

Ejemplo de SqlDataAdapter (basado en el ejemplo anterior pero levemente modificado):

 public List Listar()
 {
 SqlConnection con = new SqlConnection(cadenaConexion);
 SqlCommand com = new SqlCommand("LISTAR_CAMPANAS", con);
 com.CommandType = System.Data.CommandType.StoredProcedure;
 SqlDataAdapter da = new SqlDataAdapter(com);
 con.Open();

 SqlDataReader drCampanas = da.SelectCommand.ExecuteReader();
 List listaCampanas = new List();

 while (drCampanas.Read())
 {
 listaCampanas.Add(Cargar(drCampanas));
 }

 drCampanas.Close();
 con.Close();
 return listaCampanas;
 }

En el ejemplo anterior se muestra como un SqlDataAdapter puede contener a un SqlCommand (llamado “com” en el ejemplo) que representa una sentencia Select; de igual forma, se puede agregar comandos que representen las sentencias Insert, Update y Delete utilizando sus respectivas propiedades:

            SqlCommand dummyCommand = new SqlCommand();
            da.UpdateCommand = dummyCommand;
            da.DeleteCommand = dummyCommand;
            da.InsertCommand = dummyCommand;

Si no necesitas trabajar en escenarios desconectados y si solo necesitas utilizar un comando a la vez, utiliza un SqlCommand, de lo contrario un SqlDataAdapter.

Javier Andrés Cáceres Alvis

Microsoft Most Valuable Professional – MVP
Intel Black Belt Software Developer