Respuestas:
Por otro lado, es:
A costa de:
Entonces, realmente depende de lo que esté haciendo, pero tiendo a preferir un DataReader hasta que necesite algo que solo sea compatible con un conjunto de datos. SqlDataReader es perfecto para el caso común de acceso a datos de enlace a una cuadrícula de solo lectura.
Para obtener más información, consulte la documentación oficial de Microsoft .
while (reader.Read())bucle.
La respuesta a eso puede ser bastante amplia.
Esencialmente, la principal diferencia para mí que generalmente influye en mis decisiones sobre qué usar es que con un SQLDataReader, está "transmitiendo" datos desde la base de datos. Con un SQLDataAdapter, está extrayendo los datos de la base de datos en un objeto que se puede consultar más a fondo, así como realizando operaciones CRUD.
Obviamente, con un flujo de datos, SQLDataReader es MUCHO más rápido, pero solo puede procesar un registro a la vez. Con un SQLDataAdapter, tiene una colección completa de las filas coincidentes con su consulta desde la base de datos para trabajar con / pasar su código.
ADVERTENCIA: Si está utilizando un SQLDataReader, SIEMPRE, SIEMPRE, SIEMPRE asegúrese de escribir el código adecuado para cerrar la conexión, ya que mantiene la conexión abierta con el SQLDataReader. Si no se hace esto, o si se manejan los errores de manera adecuada para cerrar la conexión en caso de que se produzca un error en el procesamiento de los resultados, se APAGARÁ su aplicación con fugas de conexión.
Disculpe mi VB, pero esta es la cantidad mínima de código que debe tener al usar un SqlDataReader:
Using cn As New SqlConnection("..."), _
cmd As New SqlCommand("...", cn)
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
''# ...
End While
End Using
End Using
C # equivalente:
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
Un SqlDataAdapter se usa generalmente para llenar un DataSet o DataTable y, por lo tanto, tendrá acceso a los datos después de que se haya cerrado su conexión (acceso desconectado).
El SqlDataReader es un cursor rápido y conectado que tiende a ser generalmente más rápido que llenar un DataSet / DataTable.
Además, con un SqlDataReader, maneja sus datos un registro a la vez y no guarda ningún dato en la memoria. Obviamente con un DataTable o DataSet, tiene una sobrecarga de asignación de memoria.
Si no necesita mantener sus datos en la memoria, así que solo para representar cosas, vaya a SqlDataReader. Si desea manejar sus datos de manera desconectada, elija el Adaptador de datos para llenar un DataSet o DataTable.
Use un SqlDataAdapter cuando desee llenar un DataSet / DataTable en memoria desde la base de datos. Luego tiene la flexibilidad de cerrar / eliminar la conexión, pasar la tabla de datos / establecer en la memoria. A continuación, puede manipular los datos y volver a guardarlos en la base de datos utilizando el adaptador de datos, junto con InsertCommand / UpdateCommand.
Utilice un SqlDataReader cuando desee un acceso rápido a los datos de poca huella de la memoria sin la necesidad de flexibilidad para, por ejemplo, pasar los datos por la lógica de su negocio. Esto es más óptimo para la recuperación rápida y con poco uso de memoria de grandes volúmenes de datos, ya que no carga todos los datos en la memoria de una sola vez: con el enfoque SqlDataAdapter, el DataSet / DataTable se llenaría con todos los datos, por lo que si Hay muchas filas y columnas, que requerirán mucha memoria para contener.
La función Rellenar utiliza un DataReader internamente. Si su consideración es "¿Cuál es más eficiente?", Es probable que el uso de un DataReader en un ciclo cerrado que complete una colección registro por registro sea la misma carga en el sistema que con DataAdapter.Fill.
(System.Data.dll, System.Data.Common.DbDataAdapter, FillInternal.)