Pregunta

Tengo un gran conjunto de datos (más de 100,000 registros) que deseo cargar en un DataGridView. El procedimiento almacenado que hace esto puede tardar 10 segundos o más en completarse.

Hasta ahora tengo un BackgroundWorker que impide que la UI se bloquee, y he implementado un cuadro de diálogo rudimentario 'Espere'.

Lo que me gustaría hacer es llenar de alguna manera el DataGridView con resultados a medida que se devuelven de la base de datos de alguna manera. La mejor manera de describirlo es cómo lo hace el SQL Server Management Studio: cuando se ejecuta una consulta, las filas regresan inmediatamente aunque la consulta aún se está ejecutando. También hay un botón para detener la consulta y mantener las filas que se han devuelto.

¿Cómo puedo hacer esto en mi propio código?

El DataGridView solo se usa para mostrar las filas de datos, y luego el usuario hace clic en uno para hacer otra cosa. Nada se vuelve a escribir en la base de datos.

¿Fue útil?

Solución

100,000 filas en una vista de cuadrícula de datos? solo di '' no ''

  1. el usuario no puede ver 100,000 filas a la vez
  2. el tráfico de red para transmitir 100,000 filas no es insignificante
  3. la sobrecarga de memoria para 100,000 filas de datagridview no es insignificante
  4. el usuario solo necesita seleccionar una fila y continuar
  5. si esta aplicación alguna vez es utilizada por más de un usuario a la vez, el DBA lo perseguirá

sigue los consejos de austin y muestra solo una página a la vez

Otros consejos

Parece que la mejor opción sería utilizar algún tipo de mecanismo de paginación, por lo que solo muestra al usuario una cantidad determinada de datos a la vez. Eso aceleraría extraer los datos y cargar la página. Puede usar la paginación integrada de GridView (recomendaría usar la memoria caché .NET con este enfoque porque extrae todo el conjunto de datos cada vez, aunque solo muestre una página de registros). También puede implementar la paginación con LINQ to SQL donde solo toma una página a la vez. A continuación hay un enlace a un buen artículo que encontré recientemente que explica cómo hacerlo.

http://www.dbtutorials.com/display /linq-to-sql-paging-cs.aspx

Según lo sugerido por otros, mostrar 100K registros en una cuadrícula suena como una mala idea, pero si realmente tiene que ...

Está en el camino correcto con su hilo de trabajo en segundo plano, pero tendrá que usar un lector de datos y leer las filas secuencialmente a medida que se devuelven. Su subproceso de trabajo en segundo plano luego necesitaría reunir una fila de cuadrícula además del subproceso de la interfaz de usuario para cada fila leída desde el lector de datos.

Tenga en cuenta que cualquier beneficio de usar un hilo separado para mantener la respuesta de la IU se negará, ya que de todos modos estará ocupado agregando filas constantemente. Le propongo que implemente algún tipo de enfoque de procesamiento por lotes y que la interfaz de usuario agregue nuevas filas solo una vez cada segundo más o menos. Querrás tener mucho cuidado aquí y tener en cuenta una posible condición de carrera. Podría surgir una situación en la que su trabajador en segundo plano agregue filas del lector de datos a algún tipo de colección, y su interfaz de usuario podría querer leer la colección al mismo tiempo, lo que seguramente generará problemas.

Dudo que pueda hacerlo en un DataGridView de la misma manera que lo hace Management Studio. Diría que obtienes todas las filas de tu aplicación a la vez cuando finaliza la llamada al procedimiento almacenado.

También puede buscar algunos ajustes de back-end. Agregar un índice en tal caso nos ha ayudado muchas veces. Intente ejecutar el procedimiento almacenado desde SQL Server Management Studio con el "Plan de ejecución" Opción habilitada. Busque lugares donde el procedimiento almacenado podría estar empantanado (es decir, porcentajes de ejecución altos). Cuando pase el mouse sobre los elementos, verá una lista de detalles de ejecución. Al final de la lista, observe si se están comparando campos. Esos son regalos muertos para indexar candidatos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top