Problemas con SQLSTRINGCONNECT() al reintentar una conexión fallida

1,028 views
Skip to first unread message

Fernando D. Bozzo

unread,
Aug 14, 2013, 7:59:13 AM8/14/13
to publice...@googlegroups.com
Debido a un error que me reportaron en un programa de consulta (un utilitario de soporte para desarrollo), me encuentro con que si se intentan conexiones con SQLTRINGCONNETC() y el primer intento falla, el resto de intentos fallará aunque sea correcto.

Este utilitario comprueba la conexión de varios drivers ODBC para detectar si hay alguno instalado, de forma que recorre una lista como esta intentando conectarse con cada uno:

    laDrivers( 2)    = "DRIVER={Oracle en Ora91}"
    laDrivers( 3)    = "DRIVER={Oracle en Oracle9i}"
    laDrivers( 4)    = "DRIVER={Oracle en Oracle91}"
    laDrivers( 5)    = "DRIVER={Microsoft ODBC for Oracle}"
    laDrivers( 6)    = "DRIVER={Microsoft ODBC para Oracle}"
    laDrivers( 7)    = "DRIVER={Oracle Driver}"

En este caso el laDrivers(5) es un driver correcto, pero como comienza probando el primero, que falla, luego los demás intentos fallan también.

El caso es que si intento la conexión directamente con ese driver en mi PC, se conecta sin problemas, por lo que deduzco que ante un error queda algo mal en la memoria o en algún sitio y luego ya no se puede reintentar más.

Lo raro que esto solo falla en programa, porque si se intenta desde la ventana de comandos no falla.
Busqué información sobre esto en Internet, pero el único post que encontré con alguien con este problema jamás fue respondido.

En fin, dejo el código usado para los intentos de conexión por si alguien ya se topó con este problema y sabe como se soluciona.

Gracias.-

    LPARAMETERS tcServer, tcUsuario, tcPassword
    lcDriver = "DRIVER={Oracle en Home}"
    lcCadena = ";SERVER=" + tcServer + ";UID=" + tcUsuario + ";PWD=" + tcPassword
    lcCadenaExtra = ""

    laDrivers( 1)    = lcDriver
    laDrivers( 2)    = "DRIVER={Oracle en Ora91}"
    laDrivers( 3)    = "DRIVER={Oracle en Oracle9i}"
    laDrivers( 4)    = "DRIVER={Oracle en Oracle91}"
    laDrivers( 5)    = "DRIVER={Microsoft ODBC for Oracle}"
    laDrivers( 6)    = "DRIVER={Microsoft ODBC para Oracle}"
    laDrivers( 7)    = "DRIVER={Oracle Driver}"
    SQLDISCONNECT(0)

    FOR EACH lcDriver IN laDrivers
        FOR I = 1 TO 10
            IF I=1
                lcLOG    = lcLOG + CHR(13) + CHR(10) + 'Se probará con Driver [' + lcDriver + ']... '
            ENDIF
            WAIT WINDOW NOCLEAR TIMEOUT 1 'Reintento ' + TRANSFORM(I) + '. Intentando conexión con driver ' + lcDriver + '...'
            DOEVENTS
            lnHandle    = SQLSTRINGCONNECT(lcDriver + lcCadena + lcCadenaExtra, .T.)
            IF lnHandle < 0
                DOEVENTS
                AERROR(laError)
                SQLDISCONNECT(0)
                IF I=1
                    lcLOG    = lcLOG + ' => Fallo de conexión (' + TRANSFORM(lnHandle) + ')'
                ENDIF
            ELSE
                EXIT
            ENDIF
        ENDFOR
        IF lnHandle > 0
            EXIT
        ENDIF
    ENDFOR

    WAIT CLEAR

    IF lnHandle < 0
        SQLDISCONNECT(0)
        lcLOG    = lcLOG + CHR(13) + CHR(10) + 'No se harán más intentos.'
        MESSAGEBOX( lcLOG, 0+16, 'ERROR DE CONEXIÓN ODBC' )
    ENDIF



Claudio Luna

unread,
Aug 14, 2013, 8:13:28 AM8/14/13
to Comunidad de Visual Foxpro en Español
Fernando,
Que error te da específicamente cuando da error veo que estas usando Aerror pero despues no mostras el error.co laerro(2), quizás esto nos pueda dar mas luz al tema.
Me pongo a buscar en la web...
Un saludo
Claudio
--
Claudio Luna
Monttevideo - Uruguay
SKYPE: clunamarin
Cel. 099 194 770

Luis Maria Guayan

unread,
Aug 14, 2013, 8:29:00 AM8/14/13
to publice...@googlegroups.com
Buen día Fernando, una cosa que puedes probar (seguramente ya lo hiciste), es cambiar el nombre de la variable del FOR EACH, no uses lcDriver, ya que veo es una variable privada que ya viene con un valor asignado.

Otra cosa por probar es declarar el Array laDrivers dentro del procedimiento (no veo la declaración allí)

Saludos,




Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Fer

unread,
Aug 14, 2013, 8:42:42 AM8/14/13
to publice...@googlegroups.com

Hola LuisMa, el programa es bastante más grande, solo recorté la parte de las conexiones, pero está todo declarado local, incluso el arranque, pero no lo llegué a copiar.
Seguramente me convenga cambiar el enfoque y obtener directamente la lista de drivers ODBC instalados, pero aún así el problema sería el mismo si el primer intento falla.
Otra cosa que pensé probar es usar los drivers ODBC pero con ADO, a ver si de esa forma aislo el problema y me deja seguir reintentando.

Fernando D. Bozzo

unread,
Aug 14, 2013, 9:29:37 AM8/14/13
to publice...@googlegroups.com
Hola Caludio:

SQLSTRINGCONNECT() devuelve -1, y AERROR devuelve esto:


LAERROR     Priv   A  crearconexion
   (   1,   1)     N  1526        (      1526.00000000)
   (   1,   2)     C  "Connectivity error: [Microsoft][Administrador
                       de controladores ODBC] Error de SQLSetConnect
                      Attr del controlador"
   (   1,   3)     C  "[Microsoft][Administrador de controladores OD
                      BC] Error de SQLSetConnectAttr del controlador
                      "
   (   1,   4)     C  "IM006"
   (   1,   5)     N  0           (         0.00000000)
   (   1,   6)     N  1           (         1.00000000)
   (   1,   7)     C  .NULL.
   (   2,   1)     N  1526        (      1526.00000000)
   (   2,   2)     C  "Connectivity error: [Microsoft][Administrador
                       de controladores ODBC] Error de SQLSetConnect
                      Attr del controlador"
   (   2,   3)     C  "[Microsoft][Administrador de controladores OD
                      BC] Error de SQLSetConnectAttr del controlador
                      "
   (   2,   4)     C  "IM006"
   (   2,   5)     N  0           (         0.00000000)
   (   2,   6)     N  1           (         1.00000000)
   (   2,   7)     C  .NULL.
   (   3,   1)     N  1526        (      1526.00000000)
   (   3,   2)     C  "Connectivity error: [Microsoft][Administrador
                       de controladores ODBC] Error de SQLSetConnect
                      Attr del controlador"
   (   3,   3)     C  "[Microsoft][ODBC driver for Oracle]Atributo d
                      e cadena de conexión no válido"
   (   3,   4)     C  "01S00"
   (   3,   5)     N  0           (         0.00000000)
   (   3,   6)     N  1           (         1.00000000)
   (   3,   7)     C  .NULL.


Gracias!

Fernando D. Bozzo

unread,
Aug 14, 2013, 12:11:30 PM8/14/13
to publice...@googlegroups.com
Bueno, creo que tengo una solución que, aunque no resuelve el problema de bloqueo de conexión cuando el driver no existe, sí que resuelve el problema de no probar un driver que no existe.

Lo que hice fue usar la clase REGISTRY.VCX de las Foundation Clases (FFC) de FoxPro y con el método getODBCDrvrs() obtengo todos los drivers ODBC instalados, luego filtro solo los que contengan "ORACLE" en el nombre y listo.


Saludos y gracias!

Douglas Sánchez

unread,
Aug 14, 2013, 2:26:53 PM8/14/13
to publice...@googlegroups.com
Hola Fernando algo asi tengo yo para verificar cada conexion, Yo uso register.prg que viene con vfp.
otra cosa porque no envias un post programa con tu instalador del driver que vos deseas usar alguien del foro me recomendo usar este driver   OracleXEClient, es bastantes estable ya esta comprobado.


Public aODBCData
oReg = Createobject("ODBCReg")
Dimension aODBCData(1)
m.nErrNum = oReg.GetODBCDrvrs(@aODBCData)

Local iDriver
iDriver = Ascan(aODBCData,'Oracle')
If iDriver < 0 Then
    ******?'Si está instalado algún Driver de ODBC Para SQL Server: '
    =MESSAGEBOX("No esta instalado el Driver de Oracle...",0+16,"Alerta")
    RETURN .f.
ENDIF
RELEASE oreg,aODBCData

Saludes

DOUGLAS
--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Claro: 505 88495476

Fernando D. Bozzo

unread,
Aug 14, 2013, 2:49:49 PM8/14/13
to publice...@googlegroups.com
Hola Douglas, algo así como lo que comentás es lo que terminé haciendo.

El driver que estoy usando es el de Microsoft (Microsoft ODBC for Oracle), que igual lo uso poco porque en general uso el OraOLEDB que viene con Oracle, pero en este caso se trataba de un utilitario que hizo otro compañero y que tuve que modificar y mejorar.

Saludos y gracias.-



Reply all
Reply to author
Forward
0 new messages