update net asp sql-server datagridview background backgroundworker

sql server - net - Fondo rellenando un DataGridView de un SqlDataAdapter



sqldataadapter update (5)

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

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 IU se bloquee, y he implementado un rudimentario diálogo ''Esperar''.

Lo que me gustaría hacer es llenar de alguna manera DataGridView con resultados, ya que se devuelven de la base de datos de alguna manera. La mejor manera de describirlo es cómo lo hace SQL Server Management Studio: cuando se ejecuta una consulta, las filas vuelven 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. No se escribe nada en la base de datos.


Parece que la mejor opción sería usar algún tipo de mecanismo de búsqueda, de modo que solo le muestre al usuario una cantidad determinada de datos a la vez. Eso aceleraría la extracción de datos y la carga de la página. Puede usar la paginación incorporada de GridView (recomendaría usar la caché .NET con este enfoque, ya que extrae todo el conjunto de datos a pesar de que solo muestra una página de registros). También puede implementar paginación con LINQ to SQL donde solo puede obtener 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


También puede buscar algo de afinación 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 la opción "Plan de ejecución" habilitada. Busque lugares donde el procedimiento almacenado podría estar empantanado (es decir, altos porcentajes de ejecución). Cuando pasa el mouse sobre los elementos, verá una lista de detalles de ejecución. En la parte inferior de la lista, fíjate si se están comparando los campos. Esos obsequios para indexar candidatos.


100.000 filas en una vista de tabla 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 te perseguirá

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


Como lo sugirieron otros, mostrar 100K registros en una grilla suena como una mala idea, pero si realmente tiene que ...

Estás en el camino correcto con el hilo de Backgroundworker, pero deberás usar un lector de datos y leer las filas secuencialmente a medida que se devuelven. El hilo de trabajo en segundo plano tendría que ordenar una adición de fila de grilla a través de la secuencia de UI para cada fila leída del lector de datos.

Tenga en cuenta que cualquier beneficio de usar un hilo separado para mantener la UI receptiva será negado ya que estará ocupado constantemente agregando filas de todos modos. Propongo que implemente algún tipo de enfoque por lotes, y haga que la interfaz de usuario agregue filas nuevas solo una vez cada segundo más o menos. Deberá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 de origen esté agregando filas del lector de datos a algún tipo de colección, y su UI podría querer leer la colección al mismo tiempo, esto casi seguramente generará problemas.