FoxPro/Visual FoxPro - Try/Catch para Evitar ventana de conexion ODBC MySql

   
Vista:

Try/Catch para Evitar ventana de conexion ODBC MySql

Publicado por Dalsom@yahoo.com (609 intervenciones) el 17/04/2015 05:54:44
Hola a todos,

Como puedo tratar este error, ya que con On Error tampoco funciona.

Si ejecuto el procedimiento de abajo, el catch nunca entra.

1
2
3
4
5
6
7
8
9
10
procedure MyConnection
open database MySqldbc shared
lreturn = .t.
Try
     mycnn = sqlconnect([MySqlConn])   && Digamos que usuario/password estan erroneos y no debe conectar.
catch
    messagebox("No se pudo conectar a la BD.", 48, "My Application")  && esta instruccion nunca se ejecuta!!!!
    lreturn = .f.
endtry
return lreturn

La base de datos es en MySql, e utilizo ODBC para conectarme. Siempre conecta bien, pero a veces falla y no puedo manejar o tratar el error con Try/Catch.

Gracias de antemano.
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

Try/Catch para Evitar ventana de conexion ODBC MySql

Publicado por Juan López (100 intervenciones) el 17/04/2015 12:13:41
Buenas Dalsom

Quizás el problema es que no estás usando bien el try ... catch, sólo se lanza cuando hay un fallo de programación o un error durante el proceso y con el comando que usas sqlconnect te va a devolver siempre una variable lógica .T. (si conecta) y .F. (sino conecta).

Si lo que quieres es que lance un mensaje avisando que no funciono la conexión, yo lo haría así, en vez del código con try ... catch:

mycnn = sqlconnect([MySqlConn])

if !mycnn
messagebox("No se pudo conectar a la BD.", 48, "My Application")
lreturn = .F.
endif

return lreturn

Espero haberte ayudado

Un saludo
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

Try/Catch para Evitar ventana de conexion ODBC MySql

Publicado por Dalsom (609 intervenciones) el 17/04/2015 14:45:23
Buenos días Juan Lopez,

De ser asi, fíjate que en el procedimiento tengo la función/procedimiento sqlconnect enviando el resultado a una variable. Por lo que no debería lanzarme la ventana de coneccion del ODBC antes de enviarme el resultado a la variable.

En el ejemplo que me das, ni siquiera llega a la sentencia If, y me presenta la ventana de conexión de ODBC.

Gracias de todas formas, pero aun en la forma que me dices, el problema persiste.
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

Try/Catch para Evitar ventana de conexion ODBC MySql

Publicado por Fidel José (558 intervenciones) el 18/04/2015 01:01:40
Lo que tienes equivocado es el concepto de try catch endtry.
En tu caso, no se produce ningún error, sino que no se debe producir la conexión por una cuestión progamada. Si se produce la conexión, devuelve un entero positivo distinto de cero, que debes conservar para ejecutar otras acciones.

Mira este ejemplo de la ayuda:
1
2
3
4
5
6
7
STORE SQLCONNECT('MyFoxSQLNT', 'myUserID', 'myPassword') TO gnConnHandle
IF gnConnHandle <= 0
   = MESSAGEBOX('Cannot make connection', 16, 'SQL Connect Error')
ELSE
   = MESSAGEBOX('Connection made', 48, 'SQL Connect Message')
   = SQLDISCONNECT(gnHandle)
ENDIF

En cambio, se produciría un error si, por ejemplo, el conetenido de [MySqlConn] es erróneo.

En el siguiente ejemplo puedes ver un uso simple de Try Catch

(Puedes ver mejores ejemplos en)
http://fdbozzo.blogspot.com.es/2014/01/desmitificando-el-control-de-errores.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
PROCEDURE Delete_Excel_Sheet
LPARAMETERS tcFile , tcSheet_to_Delete , tnFlag , tlShowBook ,tlShowInfo
 
*!*	Method_Name			Delete_Excel_Sheet
*!* Propósito 			Quitar una Hoja de un libro Excel ®
*!* Respuesta 			boolean: si quitó la hoja del libro.
*!*
*!*	tcFile:				 ADDBS(path)+archivo+extension
*!*	tcSheet_to_ Delete     Nombre de la hoja a borrar
*!*	tnFlag				* Default= Maximized
*!*						* tnFlag = 0	Maximized	(-4137)
*!*						* tnFlag = 1	Minimezed	(-4140)
*!*						* tnFlag = 2	Normal		(-4143)
*!* tlShowBook 			Si muestra el libro de Microsoft Excel ®
*!*	tlShowInfo			 Si muestra el archivo log
*!*	-------------------------------------------------------------
tnFlag=EVL(tnFlag,0)
lnWinSta = ICASE(tnFlag=1,-4140,;
			tnFlag=2,-4143,;
			-4137)
 
LOCAL i, ;
	loFso,;
	lnSheets ,;
	loExcel as Object ,;
	lcString,;
	lcDeletedSheet,;
	lcFileInfo
 
lcFileInfo = ADDBS(FULLPATH(""))+"ExcelOpen.txt"
lcString = ""
lcDeletedSheet = ""
loExcel = null
 
TRY
	LOCAL loErr as Exception
	loFso=NEWOBJECT("Scripting.FileSystemObject")
	IF NOT EMPTY(tcFile) AND loFso.FileExists(tcFile)
 
		*Determinar si hay una instancia de Excel creada.
		*Puede no existir por lo que se ignora el error
		TRY
			LOCAL LoExisOb as Exception
			loExcel = GETOBJECT(, "Excel.Application")
		CATCH TO loexisOb
 
		ENDTRY
 
 
		TRY
			LOCAL loex as Exception
			IF VARTYPE(loExcel)#"O"
				loExcel = CREATEOBJECT("Excel.Application")
			ENDIF
			loExcel.Workbooks.Open(tcFile)
			lnSheet=loExcel.Sheets.Count
 
			* Informe
			lcString = m.lcString ;
				+"<ExcelOpen>"+CHR(13);
				+CHR(9)+"<File>"+tcFile+"</File>" + CHR(13) ;
				+CHR(9)+"<Sheets>"+CHR(13)
 
			* Busca y elmina la hoja 'tcSheet_To_Delete'
			FOR i= m.lnSheet TO 1 STEP -1
				lcString = m.lcString ;
					+REPLICATE(CHR(9),2) + loExcel.Sheets(m.i).name + CHR(13)
 
				IF LOWER(loExcel.Sheets(i).name) == LOWER(tcSheet_To_Delete)
					lcDeletedSheet=loExcel.Sheets(m.i).name
					loExcel.sheets(i).Delete
 
				ENDIF
 
			NEXT
 
			* Informe
			lcString = m.lcString ;
				+CHR(9)+"</Sheets>"+CHR(13)+CHR(13) ;
				+CHR(9)+"<Deleted>"+m.lcDeletedSheet+"</Deleted>"+CHR(13)+CHR(13) ;
				+"</ExcelOpen>"+CHR(13)
 
			* Si borró alguna hoja, grabar el libro
			IF NOT EMPTY(m.lcDeletedSheet)
				loExcel.Save()
			ENDIF
 
 
			IF tlShowBook
				loExcel.WindowState= m.lnWinSta
			ENDIF
			loExcel.visible=tlShowBook
 
		CATCH TO loex
			loex.UserValue=PROGRAM()+ CHR(13);
				+IIF(VARTYPE(m.loExcel)#"O","Microsoft Excel ® no está instalado","")
			ShowError(loEx)	&& Mostrar error
		FINALLY
 
 
		ENDTRY
 
	ELSE
		lcString="No se encontró el archivo "+tcFile + CHR(13)
	ENDIF
CATCH TO loErr
	loErr.UserValue=PROGRAM()
	ShowError(LoErr)		&& Mostrar error
FINALLY
	loFso=null
 
	IF !EMPTY(lcString)
		STRTOFILE(m.lcString,m.lcFileInfo)
		IF tlShowInfo
			MODIFY FILE &lcFileInfo NOEDIT NOWAIT IN SCREEN
		ENDIF
 
	ENDIF
 
ENDTRY
 
RETURN !EMPTY(lcDeletedSheet)
 
PROCEDURE ShowError
*****************************
LPARAMETERS toExcep,tlNotShow,tcCaption
tcCaption=EVL(tcCaption,"Mensaje de Error")
LOCAL lcMens
lcMens="Fecha "+TRANSFORM(DATETIME());
	+CHR(13)+"Mensaje: "+toExcep.message;
	+CHR(13)+"ErrorNo: "+TRANSFORM(toExcep.Errorno);
	+CHR(13)+"StackLevel: " + transform(toExcep.StackLevel);
	+CHR(13)+"Llamada: "+toExcep.Uservalue
IF _vfp.StartMode=0
	lcMens=lcMens+CHR(13)+"linea "+TRANSFORM(toExcep.lineno)
ENDIF
 
STRTOFILE(lcMens+CHR(13)+CHR(13),"MyErrors.log",1)
lcMens="Se ha producido un error:"+chr(13)+lcMens+chr(13)
IF !tlNotShow
	MESSAGEBOX(lcMens,0,tcCaption)
ENDIF
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

Try/Catch para Evitar ventana de conexion ODBC MySql

Publicado por Juan López (100 intervenciones) el 18/04/2015 01:00:03
Buenas de nuevo.

Entonces no te había entendido bien la pregunta. Imagino que has probado a crear la conexión ODBC con el comando sqlconnect("tuconexión","id","password") y que te habrá funcionado siempre, no? Es que si es así, quizás podrías preguntar también en el foro de MySQL, quizás allí te puedan orientar más también.

Por cierto, me confundí al comentarte lo que devuelve sqlconnect, cuando le mandas usuario y contraseña es cuando devuelve .T. or .F. cuando envías una interfaz devuelve un entero, que si la conexión no realiza es -1.

Un saludo y siento no ser de más ayuda
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