Mantiene la conexión abierta hasta que haya terminado (¡no olvide cerrarla!).
Por lo general, solo se puede repetir una vez
No es tan útil para actualizar a la base de datos
Por otro lado, es:
Solo tiene un registro en la memoria a la vez en lugar de un conjunto de resultados completo (esto puede ser ENORME )
Es lo más rápido posible para esa única iteración
Le permite comenzar a procesar resultados antes (una vez que el primer registro esté disponible). Para algunos tipos de consulta, esto también puede ser un gran problema.
SqlDataAdapter / DataSet
Le permite cerrar la conexión tan pronto como termine de cargar datos, e incluso puede cerrarla automáticamente
Todos los resultados están disponibles en la memoria.
Puede repetirlo tantas veces como lo necesite, o incluso buscar un registro específico por índice
Tiene algunas facultades incorporadas para actualizar de nuevo a la base de datos
A costa de:
Uso de memoria mucho mayor
Espera hasta que se carguen todos los datos antes de usarlos.
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.
DataSet es un almacén de datos en memoria, mientras que el lector de datos es solo un medio para recuperar los datos. En una nota más clara, puede ejecutar consultas Linq en DataSet, pero no en un lector de datos.
Partha Choudhury el
En realidad, con un poco de código adicional, ciertamente puede ejecutar consultas linq (o, al menos, una consulta) en un lector de datos. Simplemente use un bloque iterador para obtener el retorno del DataReader emitido como un IDataRecord dentro de su while (reader.Read())bucle.
Joel Coehoorn el
77
Esta respuesta es engañosa. Si ajusta sus objetos SqlConnection y SqlDataReader con instrucciones de "uso" (como debería hacerlo, ya que son IDisposable), la conexión se cerrará automáticamente. Y puede usar un DataSet con un SqlDataReader: simplemente llame a DataSet.Load (SqlDataReader).
RickNZ
44
@RickNZ No se apresure a confiar en el uso de declaraciones para cerrar cosas por usted. Llaman al método Dispose () del objeto, no al método Close (), y me he encontrado con al menos un caso en el que Dispose en realidad no cerró el objeto para mí. Siempre es mejor incluir una llamada explícita al método close dentro del bloque using.
Cdaragorn
55
@Cdaragorn, los documentos de MSDN generalmente son bastante claros acerca de Cerrar () vs.Disponer (). En el caso de SqlConnection, por ejemplo, los documentos dicen que Close () y Dispose () son funcionalmente equivalentes. No tengo ninguna objeción a llamar a Close (), pero las llamadas a Dispose () también deberían estar disponibles para todos los ID desechables, y la forma más limpia de hacerlo es con una declaración de uso. En los casos en que sepa que Dispose () no llama a Close (), debe llamar a Close () dentro de un bloque final si puede, no dentro del bloque de uso (por lo que aún se llama si hay una excepción).
RickNZ
17
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:
Si su objetivo es obtener datos usando una consulta select en db, y solo accede a estos datos en diferentes filas, vaya a la fila anterior, etc., entonces puede usar el SQLDatareader y cargarlo en una tabla de datos usando dtable.Load (rdr). Luego navegue hacia arriba y hacia abajo dentro de esta tabla de datos. Puede usar este método en lugar de DataAdapter ...
variable
14
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.
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:
C # equivalente:
fuente
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.
fuente
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.
fuente
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.)
fuente