Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

asociar un datareader a un datagrid

139 views
Skip to first unread message

miguel

unread,
Aug 23, 2004, 11:07:12 AM8/23/04
to
Hola deseo que el datasource de un datagrid en visual .net
sea un datareader ya que si es un dataset este tarda
varios segundos en cargarse.

El datagrid está en un formulario de visual basic .net (no
es ASP)
y me da un error indicandome que el datareader no es un
origen de datos iList o iListSource.

Si utilizo dataset no tengo problemas para utilizar
el datagrid , el datareader tambien me funciona
correctamente para interactuar con la base de datos
(select,insert,update,delete) pero no puedo asignarlo
a un datagrid.


Cesar Rivera

unread,
Aug 23, 2004, 7:35:03 PM8/23/04
to
Saludos Miguel,

Si el dataset tarda varios segundos en tardarse es porque estás cargando un
número significativo de registros en memoria. Tu DataAdpater rellena primero
el DataSet obteniendo "todos" los registros de la tabla o tablas que
solicitastes, no es como el DataReader que sólo trae un registro y hasta que
no uses el método Read para traer el siguiente registro, sólo trabajarás con
el registro actual. Un DataReader en este caso no sería solución porque su
función principal es de un sólo recorrido y sin vuelta atrás. El datagrid
está diseñado para asociarse a un DataSet.

Aunque intentando llenar un dataset a través de un DataReader sería una
posible solución para luego asignarlo al datagrid, en realidad no lo es. El
método Fill del DataAdapter resulta más eficiente en este caso.

Me corrigen si estoy equivocado. :) Aqui estamos para aprender todos.

Angel. E. Ruiz. Pastor

unread,
Aug 23, 2004, 8:47:07 PM8/23/04
to
Amigo EL DataReader solo muestra un registro a la vez. por ende no tiene
logica mostrar los datos en un datagrid esos datos los puedes mostrar en
textbxo. si desea mostrar varios registros el DataSource del tabla gris
puede ser un DataSet un Dataview para Mostar varios registros a la vez


Saludos cordiales,
Ángel Ruiz
[MS Visual Basic Developer MVP]
Caracas - Venezuela

"El conocimiento es un bien, que crece a medida que se comparte"

"miguel" <mpr...@basf-it-services.com> wrote in message
news:ba1f01c48922$de5ff320$a601...@phx.gbl...

miguel

unread,
Aug 24, 2004, 3:44:09 AM8/24/04
to
Primero gracias por contestarme pero hay algo en lo que me
pierdo, ado .net puede trabajar en dos modos conectado y
desconectado, desconectado sería con un dataset y
dataadapter y conectado que es como quiero trabajar es
utilizando ExecuteReader (select) o executeNonQuery
(insert,delete) bien yo quiero utilizar ExecuteReader, ya
se que el datareader a través del método read iré
recuperando de uno a uno los registros , pero he visto
ejemplos en los que dicen exactamente esta frase:

Un datareader también lo podemos asignar a un método
Datasource de un control web form de la siguiente forma:

Datagrid1.datasource = oCommand.ExecuteReader()

En este caso lo enlazan a un datagrid , y yo entiendo
que es como haciamos ahora enlazamos una cosulta sql en
modo conectado a un datagrid.

Cesar Rivera

unread,
Aug 24, 2004, 10:37:01 AM8/24/04
to
Es cierto lo que dices. Realicé una prueba con un proyecto en Web Forms y
resulta que si funciona asignar un DataReader a un Datagrid sin ningún
inconveniente (cosa que contradice lo que he leído acerca de los WinForms y
ADO NET). Sin embargo, no le encuentro sentido porque ejecutas el reader, lo
asignas y luego haces un DataBind porque en el momento de la llamada al
DataBind se tarda igual que cuando se usa el DataAdapter.Fill().

Programar para Webforms es un enfoque distinto a WinForms.

miguel

unread,
Aug 24, 2004, 11:34:10 AM8/24/04
to
Lo que realmente queria probar es si mediante el reader
la carga de datos era más rapida pero supongo que no.
He hecho pruebas con tablas más pequeñas (200 registros) y
el tiempo baja sobre un segundo , si es una tabla grade
(32000 registros) es sobre unos 8 0 10 segundos.
Pero lo molesto es el que no se carga el form y después
tarde en cargar el grid por eso quería bajar el tiempo ,
lo he solucionado mediante threads, he creado un thread
que carga el grid después de cargar el formulario así que
si el grid es muy grande mostraré una barra de progreso.
Otra prueba que tenía dudas es si tardaría lo mismo en
cargar desde Oracle que de SQLserver mediante SQLcommand y
tarda exactamente lo mismo en cargar el dataset.
Bien lo que al final saco de conclusión es que en WebForms
(yo no lo puedo probar) si funciona el datareader asignado
a un grid y en winforms no (que tampoco se porqué). Y si
el tiempo de carga es el mismo , cual debe ser la
diferencia ? .Gracias y un saludo

SqlRanger

unread,
Aug 24, 2004, 4:25:59 PM8/24/04
to
Un datareader no puede enlazarse a un DataGrid de WinForms, la razón es que un DataGrid de WinForms permite navegar por los registros adelante y hacia atrás y esa funcionalidad no la tiene el datareader. En WebForms sin embargo sí es posible enlazar un DataGrid a un DataReader, porque para crear el html de salida sólo es necesario leer los datos uno a uno hacia adelante, justo precisamente para lo que sirve un datareader.
 
El método Fill del DataAdapter utiliza un DataReader para leer los datos y cargarlos en el DataSet. La tardanza de la carga del DataSet se debe sobre todo al número de registros, si son 30.000, se tienen que pasar todos por la red y cargarse en la memoria local en forma de un DataSet.
 
En el modelo desconectado de .NET, es decir, usando DataSet y DataAdapter es muy importante que sólo se cargen los datos estrictamente necesarios, cuantos menos mejor, para evitar la sobrecarga de la red, del servidor de base de datos,  el agotamiento de la memoria del cliente y para minimizar el tiempo de respuesta de las aplicaciones. Todos estos son recursos limitados que hay que usar con cabeza. De nada sirve cargar en un DataSet 30.000 registros y enlazarlos a un DataGrid porque el usuario jamás los leerá todos, ni si quiera podrá echarles un vistazo. Un diseño mucho más inteligente sería presentar al usuario un formulario de búsqueda donde pudiera establecer un criterio para buscar los registros con los que quiere trabajar. A partir de ese criterio puede construirse una cláusula where que limita el número de registros a cargar en el DataSet.
 
Esto que te acabo de contar es un "PRINCIPIO FUNDAMENTAL DE DISEÑO DE APLICACIONES CON ADO.NET" que he repetido y seguiré repitiendo hasta la saciedad. A pesar de todo, la gente sigue cargando 30.000 registros en un dataset, ¡Increíble pero cierto!
 
Component One, ha diseñado un nuevo modelo de acceso a datos basado en ADO.NET que, a pesar de tener cosas muy buenas, también ayuda a cargar ingentes cantidades de registros en un DataSet y que parezca que aquello es eficiente porque lo hace en segundo plano y también usa algunas "optimizaciones". Son los llamados "DataObjects for .NET", estos vienen incluidos en "Kit de Recursos de VB.NET" un kit gratuito con muy buenas cosas descargable del "Download Centre" de Microsoft:
 
 
 

--

Saludos:
 
Jesús López
MVP Visual Developer - Visual Basic
Mentor Asociado Solid Quality Learning
www.SolidQualityLearning.com
¡No sólo formación!
 
Colaborador DotNetManía
www.dotnetmania.com
 

"No darás tropezón ni desatino que no te haga adelantar camino"
Bernardo de Balbuena (1568-1627); escritor español
 
 

miquel

unread,
Aug 25, 2004, 3:34:16 AM8/25/04
to
evidentemente hay principios de diseño y yo soy el primero
que no cargo un grid de 30000 registros por gusto, pero
quien paga mis aplicaciones es el usuario y si este me
pide que cuando entre en un formulario quiere ver en el
grid los 30000 equipos que tiene para que le sirva de guia
para despues hacer un filtro en base a las referencias que
empiezan por "XJk00Z" pues yo debo hacerselo, y si quieres
le puedo leer tu mail a ver que me dice. No siempre lo que
los programadores hariamos es lo que el usuario quiere, al
usuario le gusta moverse por el grid como por una hoja de
excel ordenar una columna y despues ir saltando con el
ratón hasta donde más o menos busca y despues en el campo
de filtro introducir algun valor y filtrar el grid, y
después ese grid te queda pues de 100 registros.Tambien
tienes que tener en cuenta que cuando creas una aplicación
el usuario te puede decir que solo tiene 10 equipos y al
cabo de 2 años tener 30000, lo que tenemos que buscar es
darle opciones, como que al entrar en el formulario si
este grid es muy grande no cargarlo y que sea el quien
decida si quiere cargarlo todo o indicando algún
parámetro, pero esta es una opción que decidirá el usuario
que es quien paga mi red, mi servidor y mi programa.Además
ahora no estoy haciendo nada comercial en .net solo viendo
sus posibilidades y el rendimiento y si es una alternativa
a otros lenguajes que utilizo actualmente.Por ejemplo
porque aunque en el grid solo tenga 10 registros el
formulario tarda 1 sg a cargarse?, pues a mi ese segundo
no me vale. Pues como he dicho antes con los threads me he
comido ese segundo y ahora si me gusta , porque el usuario
al hacer el click automáticamente ve el formulario y ahora
el decide si quiere esperar 8 segundos y ver todo el grid
o solo parte.Bueno podría seguir dando mi punto de vista
pero yo creo que este es un foro técnico para aprender
como se escribe el código para hacer esto y aquello
después será cada uno como quiera utilizarlo.

miquel

unread,
Aug 25, 2004, 3:42:47 AM8/25/04
to
Ah se me ha olvidado de decirte que mis servidores oracle
estan llenos de tablas de millones de registros osea entre
millones de registros cuando haces un filtro igual con un
poco de suerte te quedan 50.000 registros.Pero le puedo
decir a la empresa que borre unos cuantos millones de
registros más que nada para no saturar la red o decirle al
usuario que afine más la busqueda porque tantos registros
no se los puedo mostrar.

miquel

unread,
Aug 25, 2004, 5:04:50 AM8/25/04
to
El hacer esta barbaridad de ver como podría optimizar la
carga de datos en un datagrid, me ha llevado a descubrir
como funcionan los threads en visual .net y descubrir que
desde el thread no podia (después de ejecutar el fill y
tener listo el dataset )cargar el dataset directamente al
datagrid, para solucionarlo he descubierto el uso de
Operaciones asincronas para poder cargar el dataset en el
datagrid. Igual nunca cargo un datagrid tan grande pero
ahora que estoy conociendo el lenguaje me ha llevado a
aprender una cosa más ,como lo diria :

SqlRanger

unread,
Aug 25, 2004, 9:30:19 AM8/25/04
to
Miquel,
 
No es mi intención descalificar a nadie por los principios de programación por los que se rige o aplica. Mi intención sólo es exponer esos principios y las razones en las que se basan.
 
Si te saltas esos principios tienes que pagar las consecuencias, así que sería recomendable resistirse todo los posible para saltárselos y si no hay más remedio que sea por una muy buena razón.
 
Es mucho más eficiente que sea la base de datos la que filtre que cargar todos los datos y luego filtrar. Así que sería más inteligente mostrar primero un formulario de búsqueda. Si lo que el usuario quiere es poder navegar sobre el conjunto un conjunto de registros muy grande, sería más inteligente utlizar una técnica de paginación y cargar sólo páginas de un tamaño limitado, cuando el usuario le da al botón siguiente, se carga la siguiente página.
 
En el caso que planteas de tablas de millones de registros, sería un buen diseño usar un formulario de búsqueda combinado con una técnica de paginación.
 
Por mucho que el cliente se empeñe en establecer requisitos, la tecnología tiene sus limitaciones y no todos se pueden cumplir. Por ejemplo: "quiero que se me muestren todos los registros de una tabla de 20 millones de registros en un datagrid y tarde menos de dos segundos en estar toda la información disponible". Seguramente tardaría minutos en cargarse tal cantidad de información y recibirías una excepción OutOfMemory antes de terminar de cargar todos los datos.

--

Saludos:
 
Jesús López
MVP Visual Developer - Visual Basic
Mentor Asociado Solid Quality Learning
www.SolidQualityLearning.com
¡No sólo formación!
 
Colaborador DotNetManía
www.dotnetmania.com
 

"No darás tropezón ni desatino que no te haga adelantar camino"
Bernardo de Balbuena (1568-1627); escritor español
 
 

SqlRanger

unread,
Aug 25, 2004, 9:35:58 AM8/25/04
to
Pero puedes usar formularios de búsqueda y técnicas de paginación. Tampoco está de más avisar al usuario de que se está intentando traer muchos registros y sugerirle que afine más la búsqueda. Sin embargo no te recomendaría que les sugirieras que borraran registros, más que nada, porque seguramente dejarían de tomarte en serio.
 

--

Saludos:
 
Jesús López
MVP Visual Developer - Visual Basic
Mentor Asociado Solid Quality Learning
www.SolidQualityLearning.com
¡No sólo formación!
 
Colaborador DotNetManía
www.dotnetmania.com
 

"No darás tropezón ni desatino que no te haga adelantar camino"
Bernardo de Balbuena (1568-1627); escritor español
 
 

SqlRanger

unread,
Aug 25, 2004, 9:49:34 AM8/25/04
to
Te sugiero que mires esos DataObjects de Component One, hacen más optimizaciones para el tratamiento de conjuntos de datos enormes, como carga a petición en segundo plano, es una especie de paginación. Cuando activas lo que ellos llaman "Virtual Mode" y tienes una tabla enorme enlazada a un TrueDbGrid, no se cargan todos los datos sino solo una porción, cuando el usuario pincha en la barra de desplazamiento para ver la siguiente página, se cargan los datos si ya no están cargados. Si el procesador se encuentra bajo un determinado nivel, carga la siguiente página.

--

Saludos:
 
Jesús López
MVP Visual Developer - Visual Basic
Mentor Asociado Solid Quality Learning
www.SolidQualityLearning.com
¡No sólo formación!
 
Colaborador DotNetManía
www.dotnetmania.com
 
"No darás tropezón ni desatino que no te haga adelantar camino"
Bernardo de Balbuena (1568-1627); escritor español

user.mx

unread,
Aug 26, 2004, 3:51:06 AM8/26/04
to
Datareader es "read-only", "forward-only" como es que te funciona correctamente (insert, update, delete, etc.) ???


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontheadonetdatareader.asp


Cuidado con los conceptos.


Un saludo,
---


"miguel" <mpr...@basf-it-services.com> escribió en el mensaje news:ba1f01c48922$de5ff320$a601...@phx.gbl...

0 new messages