FoxPro/Visual FoxPro - Problema al conectar a base de datos ODBC

 
Vista:

Problema al conectar a base de datos ODBC

Publicado por fabian (5 intervenciones) el 15/09/2008 23:16:50
Ante todo un saludo para todos
Mi consulta es la siguiente:
Estoy haciendo una aplicación en VFP 9 que accede a una base de datos SQL Server Express 2005. Pero tengo un pequeño problema al conectarme a la base de datos que es que cuando el usuario digita mal su password o nombre de inicio de sesión automáticamente se muestra la ventana de prompt de ODBC de SQL Native Client, y eso es precisamente lo que quiero evitar.
la conexión la estoy realizando mediante las funciones de paso a través de SQL: SQLCONNECT() y SQLSTRINGCONNECT(), no estoy usando conexiones con nombre ni vistas remotas.
Gracias de antemano por su ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema al conectar a base de datos ODBC

Publicado por Guillermo Alvarez-Torres (4 intervenciones) el 16/09/2008 16:06:45
Hola Fabian.

Yo tenia un problema similar, lo resolví insertando una pequeña rutina al inicio de todas las formas que busca si en la estación de trabajo hay una tabla (semi temporal) con el perfil del usuario. Si no existe despliega una forma de seguridad (login y password) y envia esos datos para cotejarlos con la información almacendada en la tabla de usuarios, si encuentra al usuario con su login y verifica la clave de acceso, genera esta tabla semitemporal en un dbf con el perfil de ese usuario.

1. - Con este código genero el nombre de la tabla:

UB = AT("#",ALLTRIM(SYS(0)))
IF UB > 0
MAQUINA = ALLTRIM(LEFT(ALLTRIM(SYS(0)),(UB-1)))
ELSE
MAQUINA = ALLTRIM(SYS(0))
ENDIF
archperfil = "c: emp"+MAQUINA+".dbf"
CLOSE tables

2.- Si la tabla no existe corro la forma seguridad

IF !FILE(archperfil)
DO FORM seguridad
ENDIF

de lo contrario, simplemente verifico los permiso que tiene el usuario para usar la forma.

USE &archperfil
LOCATE FOR ALLTRIM(codigo) = modulo
IF FOUND()
SCATTER TO campos
coduser = campos(2)
codemp = ALLTRIM(STR(campos(1),3,0))
acceso = campos(4)
ELSE
acceso = ""
endif
CLOSE TABLES

En la forma SEGURIDAD, la validacion al campo que lleva el "password" es esta:

consulta = "select * from usuarios where usuario = '"
consulta = consulta + ALLTRIM(thisform.txtUsuario.Value) + "' "
consulta = consulta + " and clave = password('"+ALLTRIM(thisform.txtClave.Value)+"');"
resultado = SQLEXEC(sy_conecta, consulta, 'datos')
pase = .F.
SELECT datos
COUNT TO reg
IF reg > 0
GO top
SCATTER TO datusu
IF resultado > 0
pase = .t.
SCATTER TO campos
consulta = "select * from perfil where codigo_empresa = "
consulta = consulta + ALLTRIM(STR(campos(3),5,0)) + " and cod_emple = "
consulta = consulta + ALLTRIM(STR(campos(1),5,0)) +";"
respuesta = SQLEXEC(sy_conecta,consulta,'temporal')
COUNT TO nreg
IF nreg <= 0
pase = .t.
CLOSE TABLES
IF left(thisform.txtUSUARIO.Value,6) = "SYREGA"
consulta = "select codigo from modulos;"
resultado = SQLEXEC(sy_conecta,consulta,"temporal")
GO top
DO WHILE !EOF()
SCATTER TO campos
inserta = "insert into perfil values("+ALLTRIM(STR(datusu(3),5,0))+","+ALLTRIM(STR(datusu(1),5,0))+",'"
inserta = inserta + campos(1)+"','111111','"+dtoc(DATE())+"',0,'"+dtoc(DATE())+"',0);"
resultado = SQLEXEC(sy_conecta,inserta)
SKIP
ENDDO
CLOSE TABLES
consulta = "select * from perfil where codigo_empresa = 0;"
respuesta = SQLEXEC(sy_conecta,consulta,'temporal')
ENDIF
ENDIF
ENDIF
ELSE
MESSAGEBOX("Negado el acceso. Clave desconocidos",048,"")
pase = .f.
ENDIF

IF pase
SELECT temporal
COPY TO &archperfil
CLOSE tables
thisform.Release
else

SQLDISCONNECT(0)

CLEAR EVENT
APPLICATION.VISIBLE = .F.

ENDIF

Espero te sea de utilidad.

Saludos

Guillermo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al conectar a base de datos ODBC

Publicado por Fabian (5 intervenciones) el 16/09/2008 17:38:31
Gracias Guillermo por tu pronta respuesta.
Entiendo que has accesado previamente a la base de datos con un "login" específico, y luego validas el usuario y contraseña con una tabla de la base de datos.
Mi problema es que en el formulario de inicio de sesión, el usuario digita su nombre de login y su password, la cual es transformada internamente a la password real del login para acceder al SQL Server:

cDSN = <Nombre del ODBC>
cUser = thisform.txtUser.Value
cPassword = TransformarPassword(thisform.txtPassword.Value)

nCnnHandle = SQLCONNECT(cDSN, cUser, cPassword)

pero como el usuario puede digitar mal su nombre o password, entonces la función SQLCONNECT en vez de retornar un error, lo que hace es invocar a las ventanas de ODBC.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al conectar a base de datos ODBC

Publicado por Guillermo Alvarez-Torres (4 intervenciones) el 16/09/2008 19:49:16
Hola Fabian.

Prueba lo siguiente, al campo " thisform.txtUser.Value " añadale una validación como:

consulta="select * from usuarios where usuario = '"+alltrim(thisform.txtUser.value)+"';"
resultado = sqlexec(cDSN,consulta,"usuarios")

go top
scatter memvar
if m.usuario ==alltrim(thisform.txtUser.value)
return
else
return .f.
endif

y pasas a evaluar el password con el cursor "usuarios" si tienes error o regresas a un loop o cierras la aplicación.

De ehcho, si el usuario o el paswword estan errados en "nCnnHandle = SQLCONNECT(cDSN, cUser, cPassword) " te botara la pantalla del ODBC

Saludos

Guillermo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al conectar a base de datos ODBC

Publicado por Fabian (5 intervenciones) el 17/09/2008 15:51:47
Hola Guillermo.
Gracias por tu ayuda.
Pero ya encontré la solución, nada más tengo que agregar una línea antes de abrir cualquier conexión ODBC:

SQLSETPROP(0, "DispLogin", 3)

Donde:
0 (cero): es el entorno ODBC predeterminado
"DispLogin": es la propiedad que deseo configurar (Display login)
3: es el valor que le asigno a la propiedad (3=Nunca mostrar el prompt de odbc)

De esta forma si el usuario digita mal su nombre de inicio de sesión o su password ya NO me sale la pantalla de ODBC sino que la función SQLCONNECT retorna -1 y mi aplicación ya puede controlarlo.

Saludos,
Fabián.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al conectar a base de datos ODBC

Publicado por Guillermo Alvarez-Torres (4 intervenciones) el 17/09/2008 17:20:02
Hola Fabian:

Me alegro que hayas encontrado la solución y gracias por compartirla.

Saludos

Guillermo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar