Página 1 de 1

Funciones y/o clases que acceden a SQLLite y MySQL

Publicado: Jue Mar 01, 2012 1:19 am
por jasm.quitaesto
Estimados Joses e Ignacio
Como quizás sabréis estoy trabajando en implementar la forma de trabajo
de Java con [x]Harbour usando modelado de datos basados en clases en vez
de datasets. En Java las listas de datos se almacenan en forma de arrays
que contienen referencias a las clases correspondientes.
Cuando se carga una lista de clientes en vez de tener un dataset, cada
fila de la tabla se almacena como un objeto y estos se agrupan dentro de
lo que en Java se denomina un arrayList.
Actualmente para cargar los datos de cada fila de la consulta efectuada
al objeto correspondiente y de ahí­ al arrayList lo hago creando un
dataSet y recorriéndolo fila al fila. (Ejemplos en
http://jalfonsosuarez.wordpress.com/ ).
Me gustarí­a saber si es posible obtener de información de las funciones
(o clases) que usa internamente Xailer para leer los datos del motor de
datos MySQL y SQLLite para comparar velocidades de carga de datos.
Muchas gracias y un fuerte abrazo
José Alfonso Suárez Moreno

Funciones y/o clases que acceden a SQLLite y MySQL

Publicado: Jue Mar 01, 2012 11:41 am
por jasm.quitaesto
Por si aparecen dudas sobre este tema, solo quiero saber el nombre de
las funciones, que hacen, que parámetros reciben y que devuelven. Para
nada quiero el código fuente.
Y, por supuesto, con la intención de enriquecer Xailer dotándole de la
posibilidad de usar objetos para poder implementar MVC real.
Gracias y un afectuoso abrazo.
José Alfonso Suárez Moreno
El 01/03/2012 1:19, José Alfonso Suárez Moreno escribió:
> Estimados Joses e Ignacio
>
> Como quizás sabréis estoy trabajando en implementar la forma de trabajo
> de Java con [x]Harbour usando modelado de datos basados en clases en vez
> de datasets. En Java las listas de datos se almacenan en forma de arrays
> que contienen referencias a las clases correspondientes.
>
> Cuando se carga una lista de clientes en vez de tener un dataset, cada
> fila de la tabla se almacena como un objeto y estos se agrupan dentro de
> lo que en Java se denomina un arrayList.
>
> Actualmente para cargar los datos de cada fila de la consulta efectuada
> al objeto correspondiente y de ahí­ al arrayList lo hago creando un
> dataSet y recorriéndolo fila al fila. (Ejemplos en
> http://jalfonsosuarez.wordpress.com/ ).
>
> Me gustarí­a saber si es posible obtener de información de las funciones
> (o clases) que usa internamente Xailer para leer los datos del motor de
> datos MySQL y SQLLite para comparar velocidades de carga de datos.
>
> Muchas gracias y un fuerte abrazo
>
> José Alfonso Suárez Moreno
>

Funciones y/o clases que acceden a SQLLite y MySQL

Publicado: Sab Mar 03, 2012 7:46 pm
por jfgimenez
José Alfonso,
tanto en sqlite como mysql, los datos se leen y se cargan en un array
que gestiona el dataset. Puedes obtener una copia del array usando el
método GetRows() del mismo dataset.
Por otro lado, si quieres ir a un nivel más bajo, puedes utilizar
directamente el método Execute() del datasource, que es exactamente lo
que hace el dataset para obtener los datos. Es decir, los dataset no
utilizan ningún procedimiento especial, sino que llaman al método
Execute() de su datasource, y obtienen de ahí­ los datos. Este método
Execute() sí­ que está escrito en C para acelerar en todo lo posible la
carga de datos de la BD. Si notas que no va todo lo rápido que esperas
es porque tiene que leer todos los datos, convertirlos desde el tipo
nativo de la BD a un tipo compatible con xbase, y después meterlos en un
array de alto nivel. Eso es todo.
Respecto a utilizar una clase por cada fila, supongo que Java lo hace
así­ porque todo en Java son objetos. No hay nada que no lo sea, pero en
xbase es distinto, y siempre es más rápido utilizar directamente un
array que una clase que maneje ese array.
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info

Funciones y/o clases que acceden a SQLLite y MySQL

Publicado: Sab Mar 03, 2012 11:12 pm
por jasm.quitaesto
Jose,
Muchas gracias.
Esperaba que hubiese una forma nativa de utilizar las funciones de C,
pero por lo que veo no habéis "wrapeado" las funciones de bajo nivel de
C para hacer una única que hace todo el trabajo y retorna el resultado
ya convertido a xBase. Me apañaré para usar lo que existe a fin de hacer
compatible mi trabajo.
Por otro lado, manejar datos desde un array de objetos no penaliza el
rendimiento de la aplicación, mejorando la comprensión del código y
acercándolo más al modelo real.
Te invito, de nuevo, a estudiar los artí­culos que he dejado en
http://jalfonsosuarez.wordpress.com/. Espero que veas lo que yo vi
cuando me decidí­ a desarrollar este paradigma de programación. Y lo
mejor es que el motor de xBase lo soporta. Tengo una aplicación completa
usando esto con SQLite (accediendo a través de datasets convertidos a
objetos) y funciona de maravilla.
Un fuerte abrazo,
José Alfonso Suárez Moreno
El 03/03/2012 19:46, Jose F. Gimenez escribió:
> José Alfonso,
>
> tanto en sqlite como mysql, los datos se leen y se cargan en un array
> que gestiona el dataset. Puedes obtener una copia del array usando el
> método GetRows() del mismo dataset.
>
> Por otro lado, si quieres ir a un nivel más bajo, puedes utilizar
> directamente el método Execute() del datasource, que es exactamente lo
> que hace el dataset para obtener los datos. Es decir, los dataset no
> utilizan ningún procedimiento especial, sino que llaman al método
> Execute() de su datasource, y obtienen de ahí­ los datos. Este método
> Execute() sí­ que está escrito en C para acelerar en todo lo posible la
> carga de datos de la BD. Si notas que no va todo lo rápido que esperas
> es porque tiene que leer todos los datos, convertirlos desde el tipo
> nativo de la BD a un tipo compatible con xbase, y después meterlos en un
> array de alto nivel. Eso es todo.
>
> Respecto a utilizar una clase por cada fila, supongo que Java lo hace
> así­ porque todo en Java son objetos. No hay nada que no lo sea, pero en
> xbase es distinto, y siempre es más rápido utilizar directamente un
> array que una clase que maneje ese array.
>
>
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
> http://www.xailer.info

Funciones y/o clases que acceden a SQLLite y MySQL

Publicado: Dom Mar 04, 2012 1:57 am
por jasm.quitaesto
Hola Jose,
Al final me he arreglado con el método queryArray del datasource y he
creado una clase para cargar los objetos de esta forma:
METHOD lista() CLASS PersistenciaAlumno
local lista := arrayList():New()
local dS
local a
local source := PersistenciaConexion():Conectar()
dS := dataQuery():new( source, "SELECT * FROM alumno WHERE baja = 0
AND tipo = 'A'" )
WHILE ds:hasNext()
WITH OBJECT a := Alumno():New()
:setId( dS:getColumn( "Id" ) )
:setNombre( dS:getColumn( "Nombre" ) )
:setDomicilio( dS:getColumn( "Domicilio" ) )
:setCPostal( dS:getColumn( "CPostal" ) )
:setLocalidad( dS:getColumn( "Localidad" ) )
:setProvincia( dS:getColumn( "Provincia" ) )
:setCif( dS:getColumn( "Cif" ) )
:setTelefono( dS:getColumn( "Telefono" ) )
:setBaja( dS:getColumn( "Baja" ) )
END WITH
lista:add( a )
END DO
dS:end()
source:desconectar()
RETURN lista
Un fuerte abrazo
José Alfonso Suárez Moreno
El 03/03/2012 19:46, Jose F. Gimenez escribió:
> José Alfonso,
>
> tanto en sqlite como mysql, los datos se leen y se cargan en un array
> que gestiona el dataset. Puedes obtener una copia del array usando el
> método GetRows() del mismo dataset.
>
> Por otro lado, si quieres ir a un nivel más bajo, puedes utilizar
> directamente el método Execute() del datasource, que es exactamente lo
> que hace el dataset para obtener los datos. Es decir, los dataset no
> utilizan ningún procedimiento especial, sino que llaman al método
> Execute() de su datasource, y obtienen de ahí­ los datos. Este método
> Execute() sí­ que está escrito en C para acelerar en todo lo posible la
> carga de datos de la BD. Si notas que no va todo lo rápido que esperas
> es porque tiene que leer todos los datos, convertirlos desde el tipo
> nativo de la BD a un tipo compatible con xbase, y después meterlos en un
> array de alto nivel. Eso es todo.
>
> Respecto a utilizar una clase por cada fila, supongo que Java lo hace
> así­ porque todo en Java son objetos. No hay nada que no lo sea, pero en
> xbase es distinto, y siempre es más rápido utilizar directamente un
> array que una clase que maneje ese array.
>
>
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
> http://www.xailer.info

Funciones y/o clases que acceden a SQLLite y MySQL

Publicado: Dom Mar 04, 2012 3:55 pm
por xmessoft
JA no sé exactamente si además de asignar hacen algo más lo métodos
set*() de la clase Alumno pero para imprimir velocidad podrí­as hacer esto:
Lista := arrayList():New( ds:queryArray )
Así­ evitas:
1) Recorrer y cargar el mismo array dos veces
2) Llenar la memoria dos veces con los mismos datos que cuando son pocos
puede que no pase nada pero cuando son muchos dejan el ordenador frito ;-)
Por cierto a ver si me mandas lo ultimo que tengas para darle un repaso
El 04/03/2012 1:57, José Alfonso Suárez Moreno escribió:
> Hola Jose,
>
> Al final me he arreglado con el método queryArray del datasource y he
> creado una clase para cargar los objetos de esta forma:
>
> METHOD lista() CLASS PersistenciaAlumno
>
> local lista := arrayList():New()
> local dS
> local a
> local source := PersistenciaConexion():Conectar()
>
> dS := dataQuery():new( source, "SELECT * FROM alumno WHERE baja = 0 AND
> tipo = 'A'" )
>
> WHILE ds:hasNext()
> WITH OBJECT a := Alumno():New()
> :setId( dS:getColumn( "Id" ) )
> :setNombre( dS:getColumn( "Nombre" ) )
> :setDomicilio( dS:getColumn( "Domicilio" ) )
> :setCPostal( dS:getColumn( "CPostal" ) )
> :setLocalidad( dS:getColumn( "Localidad" ) )
> :setProvincia( dS:getColumn( "Provincia" ) )
> :setCif( dS:getColumn( "Cif" ) )
> :setTelefono( dS:getColumn( "Telefono" ) )
> :setBaja( dS:getColumn( "Baja" ) )
> END WITH
> lista:add( a )
> END DO
>
> dS:end()
>
> source:desconectar()
>
> RETURN lista
>
>
> Un fuerte abrazo
>
>
> José Alfonso Suárez Moreno
>
>
> El 03/03/2012 19:46, Jose F. Gimenez escribió:
>> José Alfonso,
>>
>> tanto en sqlite como mysql, los datos se leen y se cargan en un array
>> que gestiona el dataset. Puedes obtener una copia del array usando el
>> método GetRows() del mismo dataset.
>>
>> Por otro lado, si quieres ir a un nivel más bajo, puedes utilizar
>> directamente el método Execute() del datasource, que es exactamente lo
>> que hace el dataset para obtener los datos. Es decir, los dataset no
>> utilizan ningún procedimiento especial, sino que llaman al método
>> Execute() de su datasource, y obtienen de ahí­ los datos. Este método
>> Execute() sí­ que está escrito en C para acelerar en todo lo posible la
>> carga de datos de la BD. Si notas que no va todo lo rápido que esperas
>> es porque tiene que leer todos los datos, convertirlos desde el tipo
>> nativo de la BD a un tipo compatible con xbase, y después meterlos en un
>> array de alto nivel. Eso es todo.
>>
>> Respecto a utilizar una clase por cada fila, supongo que Java lo hace
>> así­ porque todo en Java son objetos. No hay nada que no lo sea, pero en
>> xbase es distinto, y siempre es más rápido utilizar directamente un
>> array que una clase que maneje ese array.
>>
>>
>> Un saludo,
>>
>> José F. Giménez
>> http://www.xailer.com
>> http://www.xailer.info
>

Funciones y/o clases que acceden a SQLLite y MySQL

Publicado: Dom Mar 04, 2012 9:53 pm
por jasm.quitaesto
Manu,
Eso está entre las ultimas cosas que te quiero mandar en unos dí­as ;-)
"Mentes sincronizadas" ;-)
Por otro lado, Manu, recuerda que en muchos casos el objeto no tiene por
que ser idéntico a la tabla.
Un abrazo.
José Alfonso Suárez Moreno
El 04/03/2012 15:55, Manu escribió:
> JA no sé exactamente si además de asignar hacen algo más lo métodos
> set*() de la clase Alumno pero para imprimir velocidad podrí­as hacer esto:
>
> Lista := arrayList():New( ds:queryArray )
>
> Así­ evitas:
> 1) Recorrer y cargar el mismo array dos veces
> 2) Llenar la memoria dos veces con los mismos datos que cuando son pocos
> puede que no pase nada pero cuando son muchos dejan el ordenador frito ;-)
>
> Por cierto a ver si me mandas lo ultimo que tengas para darle un repaso
>
> El 04/03/2012 1:57, José Alfonso Suárez Moreno escribió:
>> Hola Jose,
>>
>> Al final me he arreglado con el método queryArray del datasource y he
>> creado una clase para cargar los objetos de esta forma:
>>
>> METHOD lista() CLASS PersistenciaAlumno
>>
>> local lista := arrayList():New()
>> local dS
>> local a
>> local source := PersistenciaConexion():Conectar()
>>
>> dS := dataQuery():new( source, "SELECT * FROM alumno WHERE baja = 0 AND
>> tipo = 'A'" )
>>
>> WHILE ds:hasNext()
>> WITH OBJECT a := Alumno():New()
>> :setId( dS:getColumn( "Id" ) )
>> :setNombre( dS:getColumn( "Nombre" ) )
>> :setDomicilio( dS:getColumn( "Domicilio" ) )
>> :setCPostal( dS:getColumn( "CPostal" ) )
>> :setLocalidad( dS:getColumn( "Localidad" ) )
>> :setProvincia( dS:getColumn( "Provincia" ) )
>> :setCif( dS:getColumn( "Cif" ) )
>> :setTelefono( dS:getColumn( "Telefono" ) )
>> :setBaja( dS:getColumn( "Baja" ) )
>> END WITH
>> lista:add( a )
>> END DO
>>
>> dS:end()
>>
>> source:desconectar()
>>
>> RETURN lista
>>
>>
>> Un fuerte abrazo
>>
>>
>> José Alfonso Suárez Moreno
>>
>>
>> El 03/03/2012 19:46, Jose F. Gimenez escribió:
>>> José Alfonso,
>>>
>>> tanto en sqlite como mysql, los datos se leen y se cargan en un array
>>> que gestiona el dataset. Puedes obtener una copia del array usando el
>>> método GetRows() del mismo dataset.
>>>
>>> Por otro lado, si quieres ir a un nivel más bajo, puedes utilizar
>>> directamente el método Execute() del datasource, que es exactamente lo
>>> que hace el dataset para obtener los datos. Es decir, los dataset no
>>> utilizan ningún procedimiento especial, sino que llaman al método
>>> Execute() de su datasource, y obtienen de ahí­ los datos. Este método
>>> Execute() sí­ que está escrito en C para acelerar en todo lo posible la
>>> carga de datos de la BD. Si notas que no va todo lo rápido que esperas
>>> es porque tiene que leer todos los datos, convertirlos desde el tipo
>>> nativo de la BD a un tipo compatible con xbase, y después meterlos en un
>>> array de alto nivel. Eso es todo.
>>>
>>> Respecto a utilizar una clase por cada fila, supongo que Java lo hace
>>> así­ porque todo en Java son objetos. No hay nada que no lo sea, pero en
>>> xbase es distinto, y siempre es más rápido utilizar directamente un
>>> array que una clase que maneje ese array.
>>>
>>>
>>> Un saludo,
>>>
>>> José F. Giménez
>>> http://www.xailer.com
>>> http://www.xailer.info
>>
>

Funciones y/o clases que acceden a SQLLite y MySQL

Publicado: Dom Mar 04, 2012 10:14 pm
por xmessoft
Cuando termine este curso, que me ha impregnado de conocimientos y
quiero poner en marcha en harbour, voy a implemente algo parecido a JDBC
pero para Harbour!!! y entre otras cosas podrí­a ir perfectamente un
Hibernate para Harbour, más simple pero que funcione!!!!
Salu2
El 04/03/2012 21:53, José Alfonso Suárez Moreno escribió:
> Manu,
>
> Eso está entre las ultimas cosas que te quiero mandar en unos dí­as ;-)
>
> "Mentes sincronizadas" ;-)
>
> Por otro lado, Manu, recuerda que en muchos casos el objeto no tiene por
> que ser idéntico a la tabla.
>
> Un abrazo.
>
> José Alfonso Suárez Moreno
>
> El 04/03/2012 15:55, Manu escribió:
>> JA no sé exactamente si además de asignar hacen algo más lo métodos
>> set*() de la clase Alumno pero para imprimir velocidad podrí­as hacer
>> esto:
>>
>> Lista := arrayList():New( ds:queryArray )
>>
>> Así­ evitas:
>> 1) Recorrer y cargar el mismo array dos veces
>> 2) Llenar la memoria dos veces con los mismos datos que cuando son pocos
>> puede que no pase nada pero cuando son muchos dejan el ordenador frito
>> ;-)
>>
>> Por cierto a ver si me mandas lo ultimo que tengas para darle un repaso
>>
>> El 04/03/2012 1:57, José Alfonso Suárez Moreno escribió:
>>> Hola Jose,
>>>
>>> Al final me he arreglado con el método queryArray del datasource y he
>>> creado una clase para cargar los objetos de esta forma:
>>>
>>> METHOD lista() CLASS PersistenciaAlumno
>>>
>>> local lista := arrayList():New()
>>> local dS
>>> local a
>>> local source := PersistenciaConexion():Conectar()
>>>
>>> dS := dataQuery():new( source, "SELECT * FROM alumno WHERE baja = 0 AND
>>> tipo = 'A'" )
>>>
>>> WHILE ds:hasNext()
>>> WITH OBJECT a := Alumno():New()
>>> :setId( dS:getColumn( "Id" ) )
>>> :setNombre( dS:getColumn( "Nombre" ) )
>>> :setDomicilio( dS:getColumn( "Domicilio" ) )
>>> :setCPostal( dS:getColumn( "CPostal" ) )
>>> :setLocalidad( dS:getColumn( "Localidad" ) )
>>> :setProvincia( dS:getColumn( "Provincia" ) )
>>> :setCif( dS:getColumn( "Cif" ) )
>>> :setTelefono( dS:getColumn( "Telefono" ) )
>>> :setBaja( dS:getColumn( "Baja" ) )
>>> END WITH
>>> lista:add( a )
>>> END DO
>>>
>>> dS:end()
>>>
>>> source:desconectar()
>>>
>>> RETURN lista
>>>
>>>
>>> Un fuerte abrazo
>>>
>>>
>>> José Alfonso Suárez Moreno
>>>
>>>
>>> El 03/03/2012 19:46, Jose F. Gimenez escribió:
>>>> José Alfonso,
>>>>
>>>> tanto en sqlite como mysql, los datos se leen y se cargan en un array
>>>> que gestiona el dataset. Puedes obtener una copia del array usando el
>>>> método GetRows() del mismo dataset.
>>>>
>>>> Por otro lado, si quieres ir a un nivel más bajo, puedes utilizar
>>>> directamente el método Execute() del datasource, que es exactamente lo
>>>> que hace el dataset para obtener los datos. Es decir, los dataset no
>>>> utilizan ningún procedimiento especial, sino que llaman al método
>>>> Execute() de su datasource, y obtienen de ahí­ los datos. Este método
>>>> Execute() sí­ que está escrito en C para acelerar en todo lo posible la
>>>> carga de datos de la BD. Si notas que no va todo lo rápido que esperas
>>>> es porque tiene que leer todos los datos, convertirlos desde el tipo
>>>> nativo de la BD a un tipo compatible con xbase, y después meterlos
>>>> en un
>>>> array de alto nivel. Eso es todo.
>>>>
>>>> Respecto a utilizar una clase por cada fila, supongo que Java lo hace
>>>> así­ porque todo en Java son objetos. No hay nada que no lo sea, pero en
>>>> xbase es distinto, y siempre es más rápido utilizar directamente un
>>>> array que una clase que maneje ese array.
>>>>
>>>>
>>>> Un saludo,
>>>>
>>>> José F. Giménez
>>>> http://www.xailer.com
>>>> http://www.xailer.info
>>>
>>
>