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.

Mostrar la cita
En lo personal, si lo recomiendo.

Espero te sirva.



Mostrar la cita
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

***********

Mostrar la cita
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
#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:
Mostrar la cita
de
Mostrar la cita
lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd> MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
Mostrar la cita
esta
Mostrar la cita
no
Mostrar la cita
#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:
Mostrar la cita
de
Mostrar la cita
lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd> MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
Mostrar la cita
esta
Mostrar la cita
lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd> MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
Mostrar la cita
no
Mostrar la cita
#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...


Mostrar la cita
"Luis Guevara" wrote in message
news:
Mostrar la cita
de
Mostrar la cita
lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd> MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
Mostrar la cita
esta
Mostrar la cita
lcMystring="DATABASE=MIBASE;SERVER=xxx.xx.xxx.xx;portT32;UID=postgres;pwd> MYPASS;provider=MSDASQLR;DRIVER=postgreSQL;"
Mostrar la cita
no
Mostrar la cita
ž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º
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
Ads by Google
Search Busqueda sugerida