SqlDataAdapter vs SqlDataReader

¿Cuáles son las diferencias entre usar SqlDataAdapter vs SqlDataReader para obtener datos de un DB?

Estoy específicamente investigando sus pros y contras, así como sus rendimientos de velocidad y memoria.

Gracias

SqlDataReader:

  • Mantiene la conexión abierta hasta que haya terminado (¡no olvide cerrarla!).
  • Normalmente solo se puede repetir una vez
  • No es tan útil para actualizar a la base de datos

Por otro lado, esto:

  • Solo tiene un registro en la memoria a la vez en lugar de un conjunto de resultados completo (puede ser enorme)
  • Es lo más rápido que puede obtener para esa iteración
  • Le permite comenzar a procesar los resultados antes (una vez que el primer registro está disponible)

SqlDataAdapter / DataSet

  • Le permite cerrar la conexión tan pronto como haya terminado de cargar los datos, e incluso puede cerrarla automáticamente
  • Todos los resultados están disponibles en la memoria
  • Puedes iterar sobre él tantas veces como necesites, o incluso buscar un registro específico por índice
  • Tiene algunas facultades integradas para actualizar a la base de datos

A costa de:

  • Mucho más uso de memoria
  • Espera hasta que se carguen todos los datos antes de usar cualquiera de ellos

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 de acceso a datos común de vinculación a una grilla de solo lectura.

La respuesta a eso puede ser bastante amplia.

Básicamente, la principal diferencia para mí que suele influir en mis decisiones sobre las que debo utilizar es que con un SQLDataReader, está “transfiriendo” datos desde la base de datos. Con un SQLDataAdapter, está extrayendo los datos de la base de datos en un objeto que puede ser consultado además, así como también puede realizar 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 correspondientes a su consulta de 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 correcto para cerrar la conexión, ya que mantiene la conexión abierta con SQLDataReader. Si no se hace esto, o si se maneja correctamente el error para cerrar la conexión en caso de error en el procesamiento de los resultados, CRIPPLE su aplicación con pérdidas 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 así tendrá acceso a los datos después de que su conexión se haya cerrado (acceso desconectado).

El SqlDataReader es un cursor de avance rápido y conectado que suele ser más rápido que llenar un DataSet / DataTable.

Además, con un SqlDataReader, maneja sus datos un registro a la vez, y no retiene ningún dato en la memoria. Obviamente con un DataTable o DataSet, usted tiene una sobrecarga de asignación de memoria.

Si no necesita mantener sus datos en la memoria, así que solo para procesar cosas, vaya a SqlDataReader. Si desea tratar sus datos de manera desconectada, elija el DataAdapter para completar un DataSet o DataTable.

Utilice un SqlDataAdapter cuando quiera llenar un DataSet / DataTable en memoria de la base de datos. Luego tiene la flexibilidad de cerrar / eliminar la conexión, pasar la tabla de datos / conjunto en la memoria. A continuación, podría manipular los datos y persistir en el DB utilizando el adaptador de datos, junto con InsertCommand / UpdateCommand.

Use un SqlDataReader cuando desee acceso rápido y sin problemas a la información de huella sin la necesidad de flexibilidad, por ejemplo, para pasar los datos en torno a su lógica comercial. Esto es más óptimo para la recuperación rápida y con poca 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, de modo que si hay muchas filas y columnas, que requerirán mucha memoria para contener.