11 de abril de 2006

Las vistas remotas pueden compartir una conexion establecida por SPT

Las funciones SQLCONNECT() y SQLSTRINGCONNECT() fueron mejoradas a partir de VFP 8 para aceptar un parámetro opcional lShared.

Esta mejora permite abrir vistas remotas en un manejador (handle) establecido por SQLCONNECT() o SQLSTRINGCONNECT(), que no era posible en versiones anteriores de VFP.

Use la nueva cláusula CONNSTRING [handle] para abrir una vista remota usando una conexión SPT existente:

LOCAL lnHandle
lnHandle = SQLSTRINGCONNECT("DRIVER=sql server;SERVER=(local);UID=sa;PWD=;DATABASE=Northwind",.t.)
USE MiVistaRemota IN 0 NODATA CONNSTRING lnHandle
o
LOCAL lnHandle
lnHandle = SQLCONNECT("DSNName",.t.)
USE MiVistaRemota IN 0 NODATA CONNSTRING lnHandle

Note que este mejora también cambia el valor retornado por CURSORGETPROP('ConnectHandle'..), a partir de VFP 8, como se demuestra en el código del siguiente ejemplo.
*
*  Ejemplo de compartir una conexión SPT con una vista remota
*    SQLCONNECT()/SQLSTRINGCONNECT() parámetro lShared
*    USE MiVistaRemota CONNSTRING nHandle
*
CLOSE ALL
CLEAR
ERASE SPT.D*
CREATE DATABASE SPT
*
? "Creando la conexión C_Test en SPT.DBC..."
CREATE CONNECTION C_Test CONNSTRING ;
  "DRIVER=sql server;SERVER=(local);UID=sa;PWD=;DATABASE=Northwind"
DBSETPROP('C_Test', 'Connection', 'Asynchronous', .F.)
DBSETPROP('C_Test', 'Connection', 'BatchMode', .T.)
DBSETPROP('C_Test', 'Connection', 'Comment', '')
DBSETPROP('C_Test', 'Connection', 'DispLogin', 3)
DBSETPROP('C_Test', 'Connection', 'ConnectTimeOut', 15)
DBSETPROP('C_Test', 'Connection', 'DispWarnings', .F.)
DBSETPROP('C_Test', 'Connection', 'IdleTimeOut', 0)
DBSETPROP('C_Test', 'Connection', 'QueryTimeOut', 0)
DBSETPROP('C_Test', 'Connection', 'Transactions', 1)
*
?  "Creando una vista remota en SPT.DBC..."
CREATE SQL VIEW RV_Customers REMOTE CONNECTION C_Test SHARE AS ;
  SELECT * FROM Customers
CREATE SQL VIEW RV_Orders REMOTE CONNECTION C_Test SHARE AS ;
  SELECT * FROM Orders
CREATE SQL VIEW RV_Products REMOTE CONNECTION C_Test SHARE AS ;
  SELECT * FROM Customers
SQLDISCONNECT(0)
#IF VERSION(5) >= 800
  **************  SQLCONNECT()
  *!*  LOCAL lnUnSharedHandle, lnSharedHandle
  *!*  lnUnSharedHandle = SQLCONNECT("DSNName","sa","",.t.)
  *!*  ? "lnUnSharedHandle = ", TRANSFORM(lnUnSharedHandle)
  *!*  *  EL cuarto parámetro es nuevo y especifica
  *!*  *  que la conexión puede ser compartida
  *!*  *  con vistas remotas
  *!*  lnSharedHandle = SQLCONNECT("DSNName","sa","",.t.)
  *!*  ? "lnSharedHandle = ", TRANSFORM(lnSharedHandle)
  **************  SQLSTRINGCONNECT()
  LOCAL lnUnSharedHandle, lnSharedHandle
  lnUnSharedHandle = SQLSTRINGCONNECT("DRIVER=sql server;SERVER=(local);UID=sa;PWD=;DATABASE=Northwind")
  ? "lnUnSharedHandle = ", TRANSFORM(lnUnSharedHandle)
  *  El segundo parámetro es nuevo y especifica
  *  que la conexión puede ser compartida con 
  *  vistas remotas. Esto no era posible con
  *  versiones anteriores de VFP
  lnSharedHandle = SQLSTRINGCONNECT("DRIVER=sql server;SERVER=(local);UID=sa;PWD=;DATABASE=Northwind",.T.)
  ? "lnSharedHandle = ", TRANSFORM(lnSharedHandle)
  *
  *  El lnHandle especificadoen la cláusula CONNSTRING
  *  es nuevo e indica la existencia de un manejador
  *  por el cual se abrirá la vista. No tiene que estar
  *  definida como SHARE
  *
  DisplayProperties("UnSharedConnection",lnUnSharedHandle)
  DisplayProperties("SharedConnection",lnSharedHandle)
  ?
  ? "USE these views using the new CONNSTRING lnSharedHandle construct:"
  USE SPT!RV_Customers IN 0 NODATA CONNSTRING lnSharedHandle
  DisplayProperties("RV_Customers",CURSORGETPROP("ConnectHandle","RV_Customers"))
  USE SPT!RV_Orders IN 0 NODATA CONNSTRING lnSharedHandle
  DisplayProperties("RV_Orders",CURSORGETPROP("ConnectHandle","RV_Orders"))
  USE SPT!RV_Products IN 0 NODATA CONNSTRING lnSharedHandle
  DisplayProperties("RV_Products",CURSORGETPROP("ConnectHandle","RV_Products"))
  USE IN RV_Customers
  USE IN RV_Orders
  USE IN RV_Products
  SQLDISCONNECT(0)
#ENDIF
*
*  El siguiente comportamiento en VFP8 es distinto que en todas las versiones previas de VFP.
*
*  Antes de VFP8, las vistas remotas, eran creadas con la palabra SHARE
*  si tuvieran el mismo CURSORGETPROP("ConnectHandle"). En VFP8 cada una tiene un 
*  diferente CURSORGETPROP("ConnectHandle"), pero todas se abren por la 
*  misma conexión ODBC
*
?
? "USE these SHAREd views without any CONNSTRING clause -- "
? "this behavior is different starting in VFP 8, where "
? '    CURSORGETPROP("ConnectHandle",..)'
? "returns a different connection handle for each view (but the same statement handle)"
USE SPT!RV_Customers IN 0 NODATA
DisplayProperties("RV_Customers",CURSORGETPROP("ConnectHandle","RV_Customers"))
USE SPT!RV_Orders IN 0 NODATA
DisplayProperties("RV_Orders",CURSORGETPROP("ConnectHandle","RV_Orders"))
USE SPT!RV_Products IN 0 NODATA
DisplayProperties("RV_Products",CURSORGETPROP("ConnectHandle","RV_Products"))
USE IN RV_Customers
USE IN RV_Orders
USE IN RV_Products
SQLDISCONNECT(0)
CLOSE DATABASES ALL
ERASE SPT.D*
RETURN
*
PROCEDURE DisplayProperties(tcString,tnHandle)
  ? PADL(tcString,20)
  ?? "  VFP Conn Handle=" + TRANSFORM(tnHandle)
  ?? "  ODBC Hdbc=" + TRANSFORM(SQLGETPROP(tnHandle,"ODBChdbc") )
  ?? "  ODBC Hstmt=" + TRANSFORM(SQLGETPROP(tnHandle,"ODBChstmt"))
ENDPROC
VFP Tips & Tricks - Drew Speedie

No hay comentarios. :

Publicar un comentario