lo mas rapido para extraer 10 strings de BBDD

22/12/2003 - 22:43 por Carla | Informe spam
Hola a todos,
necesito extraer 10 cadenas que estan en una columna(esto es importante,no
estan en una fila, sino ya se que podria usar GetValues()), para copiarlas a
un array.el rendimiento es fundamental por lo que he pensado en implementar
un DataReader.La cosa es que para copiarlo a un array necesito recorrerlo 1
por 1 y copiarlo a mano, y resulta que despues el array tengo que recorrerlo
en mi aplicacion.He pensado en pasarle directamente al metodo el dataReader
y que lo recorra el mismo, pero tambien necesito que se le pueda pasar un
array.El tratamiento que tengo que hacer es bastante largo, asi que las
sobrecargas creo que serian dificiles
La unica interfaz que soportan los dos es IEnumerable
Me recomendais que lo haga asi, haciendo un metodo que tenga de parametro un
interfaz IEnumerable, o veis otra solucion?

gracias y un saludo

Preguntas similare

Leer las respuestas

#6 Carla
29/12/2003 - 10:36 | Informe spam
Ante todo gracias por el tiempo que me dedicas
Si habia pensado en crear una clase y copiar el reader a
un array de estas, pero creo que al final va a ser peor
que traerme el DataSet y copiarlo a un array.Es que mira,
la cosa es esta:
una "tabla" con 2 campos" una de estas columnas se la
tengo que pasar en forma de array a otro metodo ("procesar
(array[])" por ejemplo para que me la procese,y segun el
indice que me devuelva este ultimo metodo (procesar(array
[]), recojer de la tabla el valor de la otra columna
correspondiente a este indice

tabla en bbdd
campo1 campo2

1 pedro
2 manuel

recupero la tabla,le paso a "procesar" los valores 1 y 2.
si "procesar" me devuelve 1 tengo que acceder a pedro,si
me devuelve 2 a manuel.

Serian aproximadamente 8 filas con las que trabajaria.
Creo que al final usar un dataSet, sera lo mas limpio,
aunque no lo de mas rendimiento.si en el futuro necesito
traer un 3 campo solo tendre que cambiar la consulta y el
procesamiento del dataSet.Tendre que sacrificar el
rendimiento.
Como lo ves al final?

Te vuelvo a agradecer que te molestes,
Un saludo


Hola.

A mi tampoco me gusta la idea del DataSet.

Por que no piensas en alguna estructura de dato 'hecha a


mano'. Puede ser
tan sencilla como un arreglo de cadenas. Si, tendrías


que recorrer el
DataReader una vez, pero de esa forma podrías liberar la


conexión a la base
de datos inmediatamente. Yo estoy seguro que la


escalabilidad que puede
lograr tu aplicación al liberar pronto las conexiones de


la base de datos va
a ser mayor que la que podrías lograr por ahorrarte el


recorrido del
DataReader.

Sin embargo, en tu post anterior dices que: "no podre


hacer que mi
componente de acceso a
datos procese el Reader y me devuelva un array ya que el


reader va a
almacenar mas columnas". Esto me hace suponer que no es


en realidad
solamente una cadena por registro, sino que hay mas


campos, eso es cierto?

Mi sugerncia es que hagas una clase que tenga una


variable miembro por cada
campo del DataReader y que contenga los datos de un


registro de tu
DataReader, y que generes un arreglo que contenga 10 de


esas clases. El
tiempo de crear ese arreglo no tiene por que ser una


penalización
importante, pero logras: cerrar pronto la cadena de la


base de datos, pasar
un arreglo con todos los datos que traía originalmente


el DataReader.

Se que todo esto muy probablemente ya lo habías pensado


y simplemente
estabas buscando una mejor opción. Pero yo creo que este


enfoqe que te
platico es apropiado para el caso y no te va a causar


mayor problema de
performance.

Si quieres que te ayude con algo de código no dudes en


decirme.


Un saludo y felices fiestas

Sergio


"Carla" wrote in


message
news:017901c3c9f6$518a9400$
Hola sergio
pero entonces para recuperar 10 simples cadenas de una
BBDD voy a tener que traerme un DataSet? No tengo otra
opcion?
es que, tienes razon, la arquitectura del reader no esta
pensada para lo que quiero, pero tambien tener que
crearme el ds, dataadapter etc,cuando no voy a necesitar
actualizacion...
me parece un poco exagerado no crees?

Feliz navidad y un saludo


Se que muchas veces el buen desempeño de las


aplicaciones está peleado con
las buenas prácticas de diseño, pero considera que el


DataReader no está
hecho para ser un transporte de datos entre capas.

No te vaya a traer mas problemas de los que te soluciona


el andar pasando el
DataReader a la capa de los componentes de negocio o


presentación.

Pero bueno, repito. Si es importante el alto desemeño,


hay que sacrificar un
poco la elegancia de la solución.

Procede con cautela :)

wrote in message
news:05c801c3c92d$51f7a000$
hola Sergio,antes de nada gracias por contestar
La verdad que lo he pensado y creo que si voy a hacerlo
asi,copiarlo primero manualmente.aunque hiciera lo de
IEnumerator,despues tendria que volver a hacer una
conversion hacia arriba hacia DataRecord para volver a
extraerlo, asi que seguramente tardaria mas tienes




razon.

Lo unico es que en mi clase cliente tendre que recibir




el
DataReader (no podre hacer que mi componente de acceso a
datos procese el Reader y me devuelva un array ya que el
reader va a almacenar mas columnas) con lo cual ah atare
minimanente mi aplicacion a que acepte un
Reader,OledbDataReader en este caso.si cambio el gestor
de BBDD tambien tendre que modificar la aplicacion
cliente.Pero esto son tonterias, y es cierto, si quieres
rapidez no lo puedes tener todo.

Te agradezco la ayuda,Un saludo
Hola Carla,

En principio, me parece que lo mas adecuado para sacar


de la base de datos
el conjunto de cadenas si es un SqlDataReader por que






es
la forma mas
eficiente de hacerlo.

Pero, ¿En verdad es tan necesario ahorrarte la


conversión del DataReader al
arreglo? Es decir, si en efecto son 10 elementos ¿que


tan costoso es
realizar un recorrido para convertirlo a areglo?.

No lo pregunto por que no crea que tu problema sea






real,
pero me gustaría
saber más del contexto. ¿Ese procesamiento sobre 10


cadenas lo vas a
ejecutar muchas veces seguidas?, ¿sobre diferentes


conjuntos de cadenas?.

Mi recomendación sería hacer el método que acepte un


arreglo, y hacer un
arreglo a partir de los registros del DataReader. Es lo


mas sencillo y no sé
si efectivamente ya haz hecho mediciones de que va a


tardar mucho mas si
haces la conversíón al arreglo, yo no lo creo, pero te


repito, depende de el
contexto.

un saludo

Sergio
"Carla" wrote in message
news:
Hola a todos,
necesito extraer 10 cadenas que estan en una columna




(esto es importante,no
estan en una fila, sino ya se que podria usar






GetValues
()), para copiarlas
a
un array.el rendimiento es fundamental por lo que he




pensado en
implementar
un DataReader.La cosa es que para copiarlo a un array




necesito recorrerlo
1
por 1 y copiarlo a mano, y resulta que despues el




array tengo que
recorrerlo
en mi aplicacion.He pensado en pasarle directamente








al
metodo el
dataReader
y que lo recorra el mismo, pero tambien necesito que




se le pueda pasar un
array.El tratamiento que tengo que hacer es bastante




largo, asi que las
sobrecargas creo que serian dificiles
La unica interfaz que soportan los dos es IEnumerable
Me recomendais que lo haga asi, haciendo un metodo








que
tenga de parametro
un
interfaz IEnumerable, o veis otra solucion?

gracias y un saludo






.





.





.

Respuesta Responder a este mensaje
#7 Sergio Acosta
29/12/2003 - 20:23 | Informe spam
Que tal. En primer lugar, me divierten estos temas de diseño, asi que no te
preocupes por el timepo que le dedique, no son mas que unos instantes de
todos modos =)

Dos cosas:

1.- Como dice Rico Mariani, uno de los expertos de performance de Microsoft,
lo primero que debes hacer al diseñar aplicaciones de alto desempeño es:
realiza mediciones.
(http://weblogs.asp.net/ricom/archiv...43245.aspx) ¿Cómo sabes que
la solución de usar un DataSet no es buena? Pues ponte métricas objetivo y
míde si esa implementación las cumple. Tal vez no es tan lento como
estimabas y te llevas una grata sorpresa. Sin embargo, si esa implementación
no cumple con tus expectativas, pues necesitaras hacer una implementación
mas compleja, tal vez usando estructuras de datos hechas especialmente para
ese caso, pero ya tienes mas bases para decidir si necesitas trabajar más la
solución o no.

2.- Sugiero que uses un DataTable en vez de un DataSet. El SqlDataAdapter
soporta el método Fill para llenar un DataTable individual sin que necesite
estar dentro de un DataSet. También tu método procesar() puede recibir un
DataTable en vez de un DataSet. Tal vez el ahorrarte el DataSet sea un poco
mas eficiente.

Un saludo y suerte

Sergio

"Carla" wrote in message
news:01db01c3cdef$3677bb00$
Ante todo gracias por el tiempo que me dedicas
Si habia pensado en crear una clase y copiar el reader a
un array de estas, pero creo que al final va a ser peor
que traerme el DataSet y copiarlo a un array.Es que mira,
la cosa es esta:
una "tabla" con 2 campos" una de estas columnas se la
tengo que pasar en forma de array a otro metodo ("procesar
(array[])" por ejemplo para que me la procese,y segun el
indice que me devuelva este ultimo metodo (procesar(array
[]), recojer de la tabla el valor de la otra columna
correspondiente a este indice

tabla en bbdd
campo1 campo2

1 pedro
2 manuel

recupero la tabla,le paso a "procesar" los valores 1 y 2.
si "procesar" me devuelve 1 tengo que acceder a pedro,si
me devuelve 2 a manuel.

Serian aproximadamente 8 filas con las que trabajaria.
Creo que al final usar un dataSet, sera lo mas limpio,
aunque no lo de mas rendimiento.si en el futuro necesito
traer un 3 campo solo tendre que cambiar la consulta y el
procesamiento del dataSet.Tendre que sacrificar el
rendimiento.
Como lo ves al final?

Te vuelvo a agradecer que te molestes,
Un saludo


Hola.

A mi tampoco me gusta la idea del DataSet.

Por que no piensas en alguna estructura de dato 'hecha a


mano'. Puede ser
tan sencilla como un arreglo de cadenas. Si, tendrías


que recorrer el
DataReader una vez, pero de esa forma podrías liberar la


conexión a la base
de datos inmediatamente. Yo estoy seguro que la


escalabilidad que puede
lograr tu aplicación al liberar pronto las conexiones de


la base de datos va
a ser mayor que la que podrías lograr por ahorrarte el


recorrido del
DataReader.

Sin embargo, en tu post anterior dices que: "no podre


hacer que mi
componente de acceso a
datos procese el Reader y me devuelva un array ya que el


reader va a
almacenar mas columnas". Esto me hace suponer que no es


en realidad
solamente una cadena por registro, sino que hay mas


campos, eso es cierto?

Mi sugerncia es que hagas una clase que tenga una


variable miembro por cada
campo del DataReader y que contenga los datos de un


registro de tu
DataReader, y que generes un arreglo que contenga 10 de


esas clases. El
tiempo de crear ese arreglo no tiene por que ser una


penalización
importante, pero logras: cerrar pronto la cadena de la


base de datos, pasar
un arreglo con todos los datos que traía originalmente


el DataReader.

Se que todo esto muy probablemente ya lo habías pensado


y simplemente
estabas buscando una mejor opción. Pero yo creo que este


enfoqe que te
platico es apropiado para el caso y no te va a causar


mayor problema de
performance.

Si quieres que te ayude con algo de código no dudes en


decirme.


Un saludo y felices fiestas

Sergio


"Carla" wrote in


message
news:017901c3c9f6$518a9400$
Hola sergio
pero entonces para recuperar 10 simples cadenas de una
BBDD voy a tener que traerme un DataSet? No tengo otra
opcion?
es que, tienes razon, la arquitectura del reader no esta
pensada para lo que quiero, pero tambien tener que
crearme el ds, dataadapter etc,cuando no voy a necesitar
actualizacion...
me parece un poco exagerado no crees?

Feliz navidad y un saludo


Se que muchas veces el buen desempeño de las


aplicaciones está peleado con
las buenas prácticas de diseño, pero considera que el


DataReader no está
hecho para ser un transporte de datos entre capas.

No te vaya a traer mas problemas de los que te soluciona


el andar pasando el
DataReader a la capa de los componentes de negocio o


presentación.

Pero bueno, repito. Si es importante el alto desemeño,


hay que sacrificar un
poco la elegancia de la solución.

Procede con cautela :)

wrote in message
news:05c801c3c92d$51f7a000$
hola Sergio,antes de nada gracias por contestar
La verdad que lo he pensado y creo que si voy a hacerlo
asi,copiarlo primero manualmente.aunque hiciera lo de
IEnumerator,despues tendria que volver a hacer una
conversion hacia arriba hacia DataRecord para volver a
extraerlo, asi que seguramente tardaria mas tienes




razon.

Lo unico es que en mi clase cliente tendre que recibir




el
DataReader (no podre hacer que mi componente de acceso a
datos procese el Reader y me devuelva un array ya que el
reader va a almacenar mas columnas) con lo cual ah atare
minimanente mi aplicacion a que acepte un
Reader,OledbDataReader en este caso.si cambio el gestor
de BBDD tambien tendre que modificar la aplicacion
cliente.Pero esto son tonterias, y es cierto, si quieres
rapidez no lo puedes tener todo.

Te agradezco la ayuda,Un saludo
Hola Carla,

En principio, me parece que lo mas adecuado para sacar


de la base de datos
el conjunto de cadenas si es un SqlDataReader por que






es
la forma mas
eficiente de hacerlo.

Pero, ¿En verdad es tan necesario ahorrarte la


conversión del DataReader al
arreglo? Es decir, si en efecto son 10 elementos ¿que


tan costoso es
realizar un recorrido para convertirlo a areglo?.

No lo pregunto por que no crea que tu problema sea






real,
pero me gustaría
saber más del contexto. ¿Ese procesamiento sobre 10


cadenas lo vas a
ejecutar muchas veces seguidas?, ¿sobre diferentes


conjuntos de cadenas?.

Mi recomendación sería hacer el método que acepte un


arreglo, y hacer un
arreglo a partir de los registros del DataReader. Es lo


mas sencillo y no sé
si efectivamente ya haz hecho mediciones de que va a


tardar mucho mas si
haces la conversíón al arreglo, yo no lo creo, pero te


repito, depende de el
contexto.

un saludo

Sergio
"Carla" wrote in message
news:
Hola a todos,
necesito extraer 10 cadenas que estan en una columna




(esto es importante,no
estan en una fila, sino ya se que podria usar






GetValues
()), para copiarlas
a
un array.el rendimiento es fundamental por lo que he




pensado en
implementar
un DataReader.La cosa es que para copiarlo a un array




necesito recorrerlo
1
por 1 y copiarlo a mano, y resulta que despues el




array tengo que
recorrerlo
en mi aplicacion.He pensado en pasarle directamente








al
metodo el
dataReader
y que lo recorra el mismo, pero tambien necesito que




se le pueda pasar un
array.El tratamiento que tengo que hacer es bastante




largo, asi que las
sobrecargas creo que serian dificiles
La unica interfaz que soportan los dos es IEnumerable
Me recomendais que lo haga asi, haciendo un metodo








que
tenga de parametro
un
interfaz IEnumerable, o veis otra solucion?

gracias y un saludo






.





.





.

Respuesta Responder a este mensaje
#8 Carla
30/12/2003 - 08:40 | Informe spam
ok,sergio.Hare alguna metrica y si todo va bien creo que
ire por el lado del dataset.te agradezco mucho la
ayuda,seguire por aqui asi que seguro que pronto tendre
mas dudas.
Que pases una feliz despedida y entrada de año
un saludo

Que tal. En primer lugar, me divierten estos temas de


diseño, asi que no te
preocupes por el timepo que le dedique, no son mas que


unos instantes de
todos modos =)

Dos cosas:

1.- Como dice Rico Mariani, uno de los expertos de


performance de Microsoft,
lo primero que debes hacer al diseñar aplicaciones de


alto desempeño es:
realiza mediciones.



(http://weblogs.asp.net/ricom/archiv.../43245.asp
x) ¿Cómo sabes que
la solución de usar un DataSet no es buena? Pues ponte


métricas objetivo y
míde si esa implementación las cumple. Tal vez no es tan


lento como
estimabas y te llevas una grata sorpresa. Sin embargo,


si esa implementación
no cumple con tus expectativas, pues necesitaras hacer


una implementación
mas compleja, tal vez usando estructuras de datos hechas


especialmente para
ese caso, pero ya tienes mas bases para decidir si


necesitas trabajar más la
solución o no.

2.- Sugiero que uses un DataTable en vez de un DataSet.


El SqlDataAdapter
soporta el método Fill para llenar un DataTable


individual sin que necesite
estar dentro de un DataSet. También tu método procesar()


puede recibir un
DataTable en vez de un DataSet. Tal vez el ahorrarte el


DataSet sea un poco
mas eficiente.

Un saludo y suerte

Sergio

"Carla" wrote in


message
news:01db01c3cdef$3677bb00$
Ante todo gracias por el tiempo que me dedicas
Si habia pensado en crear una clase y copiar el reader a
un array de estas, pero creo que al final va a ser peor
que traerme el DataSet y copiarlo a un array.Es que mira,
la cosa es esta:
una "tabla" con 2 campos" una de estas columnas se la
tengo que pasar en forma de array a otro metodo


("procesar
(array[])" por ejemplo para que me la procese,y segun el
indice que me devuelva este ultimo metodo (procesar(array
[]), recojer de la tabla el valor de la otra columna
correspondiente a este indice

tabla en bbdd
campo1 campo2

1 pedro
2 manuel

recupero la tabla,le paso a "procesar" los valores 1 y 2.
si "procesar" me devuelve 1 tengo que acceder a pedro,si
me devuelve 2 a manuel.

Serian aproximadamente 8 filas con las que trabajaria.
Creo que al final usar un dataSet, sera lo mas limpio,
aunque no lo de mas rendimiento.si en el futuro necesito
traer un 3 campo solo tendre que cambiar la consulta y el
procesamiento del dataSet.Tendre que sacrificar el
rendimiento.
Como lo ves al final?

Te vuelvo a agradecer que te molestes,
Un saludo


Hola.

A mi tampoco me gusta la idea del DataSet.

Por que no piensas en alguna estructura de dato 'hecha a


mano'. Puede ser
tan sencilla como un arreglo de cadenas. Si, tendrías


que recorrer el
DataReader una vez, pero de esa forma podrías liberar la


conexión a la base
de datos inmediatamente. Yo estoy seguro que la


escalabilidad que puede
lograr tu aplicación al liberar pronto las conexiones de


la base de datos va
a ser mayor que la que podrías lograr por ahorrarte el


recorrido del
DataReader.

Sin embargo, en tu post anterior dices que: "no podre


hacer que mi
componente de acceso a
datos procese el Reader y me devuelva un array ya que el


reader va a
almacenar mas columnas". Esto me hace suponer que no es


en realidad
solamente una cadena por registro, sino que hay mas


campos, eso es cierto?

Mi sugerncia es que hagas una clase que tenga una


variable miembro por cada
campo del DataReader y que contenga los datos de un


registro de tu
DataReader, y que generes un arreglo que contenga 10 de


esas clases. El
tiempo de crear ese arreglo no tiene por que ser una


penalización
importante, pero logras: cerrar pronto la cadena de la


base de datos, pasar
un arreglo con todos los datos que traía originalmente


el DataReader.

Se que todo esto muy probablemente ya lo habías pensado


y simplemente
estabas buscando una mejor opción. Pero yo creo que este


enfoqe que te
platico es apropiado para el caso y no te va a causar


mayor problema de
performance.

Si quieres que te ayude con algo de código no dudes en


decirme.


Un saludo y felices fiestas

Sergio


"Carla" wrote in


message
news:017901c3c9f6$518a9400$
Hola sergio
pero entonces para recuperar 10 simples cadenas de una
BBDD voy a tener que traerme un DataSet? No tengo otra
opcion?
es que, tienes razon, la arquitectura del reader no esta
pensada para lo que quiero, pero tambien tener que
crearme el ds, dataadapter etc,cuando no voy a necesitar
actualizacion...
me parece un poco exagerado no crees?

Feliz navidad y un saludo


Se que muchas veces el buen desempeño de las


aplicaciones está peleado con
las buenas prácticas de diseño, pero considera que el


DataReader no está
hecho para ser un transporte de datos entre capas.

No te vaya a traer mas problemas de los que te






soluciona
el andar pasando el
DataReader a la capa de los componentes de negocio o


presentación.

Pero bueno, repito. Si es importante el alto desemeño,


hay que sacrificar un
poco la elegancia de la solución.

Procede con cautela :)

wrote in message
news:05c801c3c92d$51f7a000$
hola Sergio,antes de nada gracias por contestar
La verdad que lo he pensado y creo que si voy a hacerlo
asi,copiarlo primero manualmente.aunque hiciera lo de
IEnumerator,despues tendria que volver a hacer una
conversion hacia arriba hacia DataRecord para volver a
extraerlo, asi que seguramente tardaria mas tienes




razon.

Lo unico es que en mi clase cliente tendre que recibir




el
DataReader (no podre hacer que mi componente de acceso






a
datos procese el Reader y me devuelva un array ya que






el
reader va a almacenar mas columnas) con lo cual ah






atare
minimanente mi aplicacion a que acepte un
Reader,OledbDataReader en este caso.si cambio el gestor
de BBDD tambien tendre que modificar la aplicacion
cliente.Pero esto son tonterias, y es cierto, si






quieres
rapidez no lo puedes tener todo.

Te agradezco la ayuda,Un saludo
Hola Carla,

En principio, me parece que lo mas adecuado para sacar


de la base de datos
el conjunto de cadenas si es un SqlDataReader por que






es
la forma mas
eficiente de hacerlo.

Pero, ¿En verdad es tan necesario ahorrarte la


conversión del DataReader al
arreglo? Es decir, si en efecto son 10 elementos ¿que


tan costoso es
realizar un recorrido para convertirlo a areglo?.

No lo pregunto por que no crea que tu problema sea






real,
pero me gustaría
saber más del contexto. ¿Ese procesamiento sobre 10


cadenas lo vas a
ejecutar muchas veces seguidas?, ¿sobre diferentes


conjuntos de cadenas?.

Mi recomendación sería hacer el método que acepte un


arreglo, y hacer un
arreglo a partir de los registros del DataReader. Es








lo
mas sencillo y no sé
si efectivamente ya haz hecho mediciones de que va a


tardar mucho mas si
haces la conversíón al arreglo, yo no lo creo, pero te


repito, depende de el
contexto.

un saludo

Sergio
"Carla" wrote in message
news:
Hola a todos,
necesito extraer 10 cadenas que estan en una columna




(esto es importante,no
estan en una fila, sino ya se que podria usar






GetValues
()), para copiarlas
a
un array.el rendimiento es fundamental por lo que he




pensado en
implementar
un DataReader.La cosa es que para copiarlo a un










array
necesito recorrerlo
1
por 1 y copiarlo a mano, y resulta que despues el




array tengo que
recorrerlo
en mi aplicacion.He pensado en pasarle directamente








al
metodo el
dataReader
y que lo recorra el mismo, pero tambien necesito que




se le pueda pasar un
array.El tratamiento que tengo que hacer es bastante




largo, asi que las
sobrecargas creo que serian dificiles
La unica interfaz que soportan los dos es










IEnumerable
Me recomendais que lo haga asi, haciendo un metodo








que
tenga de parametro
un
interfaz IEnumerable, o veis otra solucion?

gracias y un saludo






.





.





.





.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida