Esta respuesta puede llegar un poco tarde, pero tal vez ayude a otros.
En muchos casos es suficiente mostrar el número de registros leídos hasta el momento. Eso podría hacerse manejando el evento DataTable.RowChanged. A partir de una implementación de prueba, pude verificar que el evento se activa para cada fila agregada por DataAdapter.Fill-Method. Al manejar el evento, puede leer los registros numéricos mirando DataTable.Rows.Count-Property
Lo que suelo hacer es leer los datos en un subproceso en segundo plano, que actualiza una entrada de etiqueta o cuadro de lista. El método que realmente actualiza la interfaz gráfica de usuario almacena en búfer las actualizaciones de la etiqueta para que los cambios de la interfaz gráfica de usuario ocurran solo una vez por segundo para evitar el parpadeo.
Espero que esto ayude.
Sascha