Cursor adapter y xml.... será demasiado lento ?????

13/09/2004 - 21:30 por Luis Guevara | Informe spam
Hola amigos:

Estoy tratando de usar el CursorAdapter y XMLAdapter para la explotación de
una BD de postgres, son mis primeras experiencias con estos controles.

Tengo el siguiente codigo:

*********

PROCEDURE ListaUsuarios() as String
LOCAL oCaUsuarios as CursorAdapter
LOCAL oXaUsuarios as XMLAdapter
LOCAL Retorno as String


lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwdMYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
lcSelect="SELECT * FROM usuario"

oCAUsuarios = CREATEOBJECT("CursorAdapter")
WITH oCAUsuarios
.Alias = "Cur_Usuario"
.DataSourceType = "ODBC"
.DataSource = SQLSTRINGCONNECT(lcMystring)
.SelectCmd = lcSelect
.Tables = "usuario"
.CursorFill()
ENDWITH

oXAUsuarios = CREATEOBJECT("XMLAdapter")
oXAUsuarios.AddTableSchema("Cur_Usuario")
oXAUsuarios.ToXML("Retorno")

oCAUsuarios = .F.
oXAUsuarios = .F.

Return(Retorno)
ENDPROC

***********

Deseo me puedan ayudar con las siguientes interrogante:

Cada vez que llame a este procedimiento, el CursorAdapter establece una
NUEVA conexion con la BD de Postgres ¿verdad?, si es así ¿No creen que esta
tecnica de explotación de datos se hace muy lenta?
Si previamente ya he establecido una conexion a la base con el código:

lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwdMYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
oConnection=SQLSTRINGCONNECT(lcMystring)

¿Existe alguna manera de indicar al CursorAdpater que ya existe esta
conexión establecida con la base de datos, la cual puede usar y por tanto no
es necesario que vuelva a conectarse? Esto con el fin de ganar velocidad.
¿recomiendan el uso del CursorAdapter?

Agradezco sus comentarios.

atte.
Luis Guevara

Preguntas similare

Leer las respuestas

#1 Esparta Palma
13/09/2004 - 22:17 | Informe spam
Nada te impide que le indiques a el cursorAdapter el que use una conexión
hecha con anterioridad, el siguiente código funciona sin problemas:

Puedes mandarle de parámetro, el handle de conexión

loConn = SQLCONNECT("Predial")


IF NOT (Usuarios(loConn))
Messagebox("No es posible obtener los usuarios del sistema...")
ELSE
BROW
ENDIF


PROCEDURE Usuarios
LPARAMETERS tnSQLHandle

LOCAL llReturn
llReturn = .F.
TRY
lcQuery ="SELECT * FROM usuario"
loCAusuario = CREATEOBJECT("CAODBC",lcQuery,"cUsuario",.T.,tnSQLHandle)
WITH loCAUsuario
.CursorFill()
llReturn = .T.
ENDWITH
CATCH TO loError
MESSAGEBOX(loError.Message)
llReturn = .F.
FINALLY
loCAUsuario = .NULL.
RELEASE loCAUsuario
ENDTRY
RETURN llReturn
ENDPROC


** CursorAdapter Personalizado
DEFINE CLASS CAODBC AS CursorAdapter
DataSourceType ="ODBC"
PROCEDURE Init
LPARAMETERS tcQuery,tcAlias,tlShared, tuHandle
WITH This
.Alias = tcAlias
.SelectCMD = tcQuery
IF tlShared
.DataSource = tnHandle
ELSE
IF NOT EMPTY(tuHandle) AND VARTYPE(tuHandle) ="C"
.DataSource = SQLSTRINGCONNECT(tuHandle)
ELSE
**** Error de programación, traer ventana de
conexiones
.DataSource = SQLCONNECT()
ENDIF
ENDIF
ENDWITH
ENDPROC
ENDDEFINE


El comportamiento del CursorAdapter lo decides tú, el grado de complejidad
lo puedes decidir también, en este caso, he creado un CursorAdapter
personalizado, en el que se le puede indicar que utilice un Handle de
conexión creado con anterioridad. En su defecto, crea la nueva conexión
según el 4to. parámetro.

¿recomiendan el uso del CursorAdapter?


En lo personal, si lo recomiendo.

Espero te sirva.



Hola amigos:

Estoy tratando de usar el CursorAdapter y XMLAdapter para la explotación de
una BD de postgres, son mis primeras experiencias con estos controles.

Tengo el siguiente codigo:

*********



PROCEDURE ListaUsuarios() as String
LOCAL oCaUsuarios as CursorAdapter
LOCAL oXaUsuarios as XMLAdapter
LOCAL Retorno as String


lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwdMYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
lcSelect="SELECT * FROM usuario"

oCAUsuarios = CREATEOBJECT("CursorAdapter")
WITH oCAUsuarios
.Alias = "Cur_Usuario"
.DataSourceType = "ODBC"
.DataSource = SQLSTRINGCONNECT(lcMystring)
.SelectCmd = lcSelect
.Tables = "usuario"
.CursorFill()
ENDWITH

oXAUsuarios = CREATEOBJECT("XMLAdapter")
oXAUsuarios.AddTableSchema("Cur_Usuario")
oXAUsuarios.ToXML("Retorno")

oCAUsuarios = .F.
oXAUsuarios = .F.

Return(Retorno)
ENDPROC

***********

Deseo me puedan ayudar con las siguientes interrogante:

Cada vez que llame a este procedimiento, el CursorAdapter establece una
NUEVA conexion con la BD de Postgres ¿verdad?, si es así ¿No creen que esta
tecnica de explotación de datos se hace muy lenta?
Si previamente ya he establecido una conexion a la base con el código:

lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd>MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
oConnection=SQLSTRINGCONNECT(lcMystring)

¿Existe alguna manera de indicar al CursorAdpater que ya existe esta
conexión establecida con la base de datos, la cual puede usar y por tanto no
es necesario que vuelva a conectarse? Esto con el fin de ganar velocidad.
¿recomiendan el uso del CursorAdapter?

Agradezco sus comentarios.

atte.


Luis Guevara


ž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º
Espartaco Palma Martínez
SysOp PortalFox.com
email:mexicoSINSPAM[Arroba]portalfox.com

-
PortalFox :: Nada corre como un zorr
http://www.portalfox.co

PortalFox - NNTP Forum Gatewa
Respuesta Responder a este mensaje
#2 Luis Guevara
14/09/2004 - 16:30 | Informe spam
Gracias Esparta:

Excelente !!! me has dado una valiosa ayuda, agradezco mucho tu aporte, con
esta solución salgo de la duda y prosigo con mi sistema Aprovechando tu
amabilidad (disculpa mi ignorancia), puedes decirme ¿ que otras propiedades
faltan en el siguiente código para que el cursor generado sea actualizable
?, porque he probado y funciona solo si ingreso nuevos registros, pero no
actualiza nada si modifico un dato ya ingresado.

loCursor = CREATEOBJECT('CursorAdapter')

lcMystring="DATABASE=MIBASEp;SERVER=XXXXXXXXXXXXX;portT32;UID=MYUSUARIO;pw
d=sMYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
lcSelect="SELECT * FROM usuario"
lcKey="usua_id"
lcTables="usuario"
lcUpdatefields="usua_nombre, usua_identificador, usua_clave"
lcUpdateNameList="usua_nombre usuario.usua_nombre, usua_identificador
usuario.usua_identificador, " + ;
"usua_clave usuario.usua_clave"

WITH loCursor
.ALIAS = 'Cur_Usuarios'
.DATASOURCETYPE = 'ODBC'
.DATASOURCE = SQLSTRINGCONNECT(lcMystring)
.SELECTCMD = lcSelect
.KEYFIELDLIST = lcKey
.TABLES = lcTables
.UPDATABLEFIELDLIST = lcUpdatefields
.UPDATENAMELIST = lcUpdateNameList

*-*-*-*-*

.UpdateType = 1 && update
.BufferModeOverride = 5

*-*-**-

ENDWITH

GO Top
APPEND BLANK
Browse
a=TABLEUPDATE(.t.)
IF a
WAIT WINDOW 'Actualización efectuada'
ENDI



atte.
Luis Guevara





"Esparta Palma" escribió en el
mensaje news:
Nada te impide que le indiques a el cursorAdapter el que use una conexión
hecha con anterioridad, el siguiente código funciona sin problemas:

Puedes mandarle de parámetro, el handle de conexión

loConn = SQLCONNECT("Predial")


IF NOT (Usuarios(loConn))
Messagebox("No es posible obtener los usuarios del sistema...")
ELSE
BROW
ENDIF


PROCEDURE Usuarios
LPARAMETERS tnSQLHandle

LOCAL llReturn
llReturn = .F.
TRY
lcQuery ="SELECT * FROM usuario"
loCAusuario = CREATEOBJECT("CAODBC",lcQuery,"cUsuario",.T.,tnSQLHandle)
WITH loCAUsuario
.CursorFill()
llReturn = .T.
ENDWITH
CATCH TO loError
MESSAGEBOX(loError.Message)
llReturn = .F.
FINALLY
loCAUsuario = .NULL.
RELEASE loCAUsuario
ENDTRY
RETURN llReturn
ENDPROC


** CursorAdapter Personalizado
DEFINE CLASS CAODBC AS CursorAdapter
DataSourceType ="ODBC"
PROCEDURE Init
LPARAMETERS tcQuery,tcAlias,tlShared, tuHandle
WITH This
.Alias = tcAlias
.SelectCMD = tcQuery
IF tlShared
.DataSource = tnHandle
ELSE
IF NOT EMPTY(tuHandle) AND VARTYPE(tuHandle) ="C"
.DataSource = SQLSTRINGCONNECT(tuHandle)
ELSE
**** Error de programación, traer ventana de
conexiones
.DataSource = SQLCONNECT()
ENDIF
ENDIF
ENDWITH
ENDPROC
ENDDEFINE


El comportamiento del CursorAdapter lo decides tú, el grado de complejidad
lo puedes decidir también, en este caso, he creado un CursorAdapter
personalizado, en el que se le puede indicar que utilice un Handle de
conexión creado con anterioridad. En su defecto, crea la nueva conexión
según el 4to. parámetro.

>¿recomiendan el uso del CursorAdapter?
En lo personal, si lo recomiendo.

Espero te sirva.



>Hola amigos:

>Estoy tratando de usar el CursorAdapter y XMLAdapter para la explotación


de
>una BD de postgres, son mis primeras experiencias con estos controles.

>Tengo el siguiente codigo:

>*********

PROCEDURE ListaUsuarios() as String
LOCAL oCaUsuarios as CursorAdapter
LOCAL oXaUsuarios as XMLAdapter
LOCAL Retorno as String





lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd> MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
lcSelect="SELECT * FROM usuario"

oCAUsuarios = CREATEOBJECT("CursorAdapter")
WITH oCAUsuarios
.Alias = "Cur_Usuario"
.DataSourceType = "ODBC"
.DataSource = SQLSTRINGCONNECT(lcMystring)
.SelectCmd = lcSelect
.Tables = "usuario"
.CursorFill()
ENDWITH

oXAUsuarios = CREATEOBJECT("XMLAdapter")
oXAUsuarios.AddTableSchema("Cur_Usuario")
oXAUsuarios.ToXML("Retorno")

oCAUsuarios = .F.
oXAUsuarios = .F.

Return(Retorno)
ENDPROC

***********

>Deseo me puedan ayudar con las siguientes interrogante:

>Cada vez que llame a este procedimiento, el CursorAdapter establece una
>NUEVA conexion con la BD de Postgres ¿verdad?, si es así ¿No creen que


esta
>tecnica de explotación de datos se hace muy lenta?
>Si previamente ya he establecido una conexion a la base con el código:


lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd
>MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
>oConnection=SQLSTRINGCONNECT(lcMystring)

>¿Existe alguna manera de indicar al CursorAdpater que ya existe esta
>conexión establecida con la base de datos, la cual puede usar y por tanto


no
>es necesario que vuelva a conectarse? Esto con el fin de ganar velocidad.
>¿recomiendan el uso del CursorAdapter?

>Agradezco sus comentarios.

>atte.
Luis Guevara


¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º
Espartaco Palma Martínez
SysOp PortalFox.com
email:mexicoSINSPAM[Arroba]portalfox.com


PortalFox :: Nada corre como un zorro
http://www.portalfox.com

PortalFox - NNTP Forum Gateway
Respuesta Responder a este mensaje
#3 luis suescun
28/09/2004 - 17:29 | Informe spam
Te Sugiero, como una manera de ahorrarte trabajo que lo manejes la conexion
"ADO"
este te evita el tener que crear un obdc en cada maquina.

Luis

"Luis Guevara" wrote in message
news:
Hola amigos:

Estoy tratando de usar el CursorAdapter y XMLAdapter para la explotación


de
una BD de postgres, son mis primeras experiencias con estos controles.

Tengo el siguiente codigo:

*********

PROCEDURE ListaUsuarios() as String
LOCAL oCaUsuarios as CursorAdapter
LOCAL oXaUsuarios as XMLAdapter
LOCAL Retorno as String





lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd> MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
lcSelect="SELECT * FROM usuario"

oCAUsuarios = CREATEOBJECT("CursorAdapter")
WITH oCAUsuarios
.Alias = "Cur_Usuario"
.DataSourceType = "ODBC"
.DataSource = SQLSTRINGCONNECT(lcMystring)
.SelectCmd = lcSelect
.Tables = "usuario"
.CursorFill()
ENDWITH

oXAUsuarios = CREATEOBJECT("XMLAdapter")
oXAUsuarios.AddTableSchema("Cur_Usuario")
oXAUsuarios.ToXML("Retorno")

oCAUsuarios = .F.
oXAUsuarios = .F.

Return(Retorno)
ENDPROC

***********

Deseo me puedan ayudar con las siguientes interrogante:

Cada vez que llame a este procedimiento, el CursorAdapter establece una
NUEVA conexion con la BD de Postgres ¿verdad?, si es así ¿No creen que


esta
tecnica de explotación de datos se hace muy lenta?
Si previamente ya he establecido una conexion a la base con el código:




lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd> MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
oConnection=SQLSTRINGCONNECT(lcMystring)

¿Existe alguna manera de indicar al CursorAdpater que ya existe esta
conexión establecida con la base de datos, la cual puede usar y por tanto


no
es necesario que vuelva a conectarse? Esto con el fin de ganar velocidad.
¿recomiendan el uso del CursorAdapter?

Agradezco sus comentarios.

atte.
Luis Guevara


Respuesta Responder a este mensaje
#4 Esparta Palma
28/09/2004 - 18:59 | Informe spam
No estará creando ODBCs en cada máquina, lo que haría sería en todo caso
crear DSNs según el ODBC intalado, VFP no necesita forzosamente que estén
creados los DSNs, ya que también puede manejar cadenas de conexión via la
función SQLStringConnect o como viste en el ejemplo de CursorAdapter,
tampoco necesita que se cree el DSN... Un ejemplo de esto:

Conectar a DBMS sin crear DSN (técnica DSNLess)
http://www.portalfox.com/article.php?sid7

Por lo tanto, no es una ventaja del ADO el manejar cadenas de conexión...


Te Sugiero, como una manera de ahorrarte trabajo que lo manejes la conexion
"ADO"
este te evita el tener que crear un obdc en cada maquina.

Luis



"Luis Guevara" wrote in message
news:
Hola amigos:

Estoy tratando de usar el CursorAdapter y XMLAdapter para la explotación


de
una BD de postgres, son mis primeras experiencias con estos controles.

Tengo el siguiente codigo:

*********

PROCEDURE ListaUsuarios() as String
LOCAL oCaUsuarios as CursorAdapter
LOCAL oXaUsuarios as XMLAdapter
LOCAL Retorno as String





lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd> MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
lcSelect="SELECT * FROM usuario"

oCAUsuarios = CREATEOBJECT("CursorAdapter")
WITH oCAUsuarios
.Alias = "Cur_Usuario"
.DataSourceType = "ODBC"
.DataSource = SQLSTRINGCONNECT(lcMystring)
.SelectCmd = lcSelect
.Tables = "usuario"
.CursorFill()
ENDWITH

oXAUsuarios = CREATEOBJECT("XMLAdapter")
oXAUsuarios.AddTableSchema("Cur_Usuario")
oXAUsuarios.ToXML("Retorno")

oCAUsuarios = .F.
oXAUsuarios = .F.

Return(Retorno)
ENDPROC

***********

Deseo me puedan ayudar con las siguientes interrogante:

Cada vez que llame a este procedimiento, el CursorAdapter establece una
NUEVA conexion con la BD de Postgres ¿verdad?, si es así ¿No creen que


esta
tecnica de explotación de datos se hace muy lenta?
Si previamente ya he establecido una conexion a la base con el código:




lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd> MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
oConnection=SQLSTRINGCONNECT(lcMystring)

¿Existe alguna manera de indicar al CursorAdpater que ya existe esta
conexión establecida con la base de datos, la cual puede usar y por tanto


no
es necesario que vuelva a conectarse? Esto con el fin de ganar velocidad.
¿recomiendan el uso del CursorAdapter?

Agradezco sus comentarios.

atte.
Luis Guevara



ž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º
Espartaco Palma Martínez
SysOp PortalFox.com
email:mexicoSINSPAM[Arroba]portalfox.com

-
PortalFox :: Nada corre como un zorr
http://www.portalfox.co

PortalFox - NNTP Forum Gatewa
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida