Foros del Web » Programando para Internet » ASP Clásico »

Problemas con rs.Close

Estas en el tema de Problemas con rs.Close en el foro de ASP Clásico en Foros del Web. Hola a todos pues bueno esta pasando algo muy raro en mi codigo quiero cerrar algo y me dice que no se puede cerrar por ...
  #1 (permalink)  
Antiguo 27/06/2005, 19:51
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 19 años, 8 meses
Puntos: 0
Problemas con rs.Close

Hola a todos pues bueno esta pasando algo muy raro en mi codigo quiero cerrar algo y me dice que no se puede cerrar por el objeto por que no esta abierto:

Código:
La operación no está permitida si el objeto está cerrado.
/usuarios.asp, línea 23
El codigo que estoy utilizando es este:

Código:
if trim(request.QueryString("confEmail")) = "s" and trim(request.QueryString("IdUsuario")) <> "" then 
	IdUsuario = trim(request.QueryString("IdUsuario"))
	SQLValidaIdUsuario = "SELECT * FROM usuarios WHERE IdUsuario="&IdUsuario&""
	rs.Open SQLValidaIdUsuario, adoCon	
	if not rs.eof  then
		Response.Cookies("usuario")("IdUsuario") = IdUsuario
		Response.Cookies("usuario")("Tipo") = rs("Tipo")
		IdUsuarioCookies = Request.Cookies("usuario")("IdUsuario")
		TipoCookies = Request.Cookies("usuario")("Tipo")		
		rs.close
		SQLModifiUsuario = " UPDATE Usuarios "
		SQLModifiUsuario = SQLModifiUsuario + " SET Activo = 's'"
		SQLModifiUsuario = SQLModifiUsuario + " WHERE IdUsuario="&IdUsuario&""		
		rs.Open SQLModifiUsuario, adoCon
		RsIdUsuarioSearch = IdUsuario	
		rs.close
esta ultima linea es la del problema y no se si se deba a que estoy utilizando UPDATE no lo se... pero bueno la pongo en comentario y más abajo me sala otro mensaje de:

Código:
La operación no está permitida si el objeto está abierto.
/usuarios.asp, línea 290
Intente controlar la cuestion de cuando el Rs esta habierto cierralo y cuando no pues no, pero no hubique como, esto es lo que puse:

Código:
		if NOT rs.EOF then 
			rs.close 
		end if
Pero claro cuendo el objeto esta cerrado me sale un error por el rs.EOF y tambien lo intente con rs <> "" y claro me dice que los parametros son diferentes, ¿como puedo validar cuando el rs esta abierto o no? para poder cerrarlo si y solo si esta abierto, gracias por sus comentarios.
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo

Última edición por speedy; 27/06/2005 a las 20:06
  #2 (permalink)  
Antiguo 27/06/2005, 21:22
Avatar de trasgukabi  
Fecha de Ingreso: septiembre-2004
Mensajes: 2.749
Antigüedad: 19 años, 9 meses
Puntos: 18
Código:
if trim(request.QueryString("confEmail")) = "s" and trim(request.QueryString("IdUsuario")) <> "" then 
	IdUsuario = trim(request.QueryString("IdUsuario"))
	SQLValidaIdUsuario = "SELECT * FROM usuarios WHERE IdUsuario="&IdUsuario&""
	rs.Open SQLValidaIdUsuario, adoCon	
	if not rs.eof  then 
             esta="SI" 'no es EOF y podemos cerrar antes el rs
         end if
          rs.close
          if esta="SI" then
		Response.Cookies("usuario")("IdUsuario") = IdUsuario
		Response.Cookies("usuario")("Tipo") = rs("Tipo")
		IdUsuarioCookies = Request.Cookies("usuario")("IdUsuario")
		TipoCookies = Request.Cookies("usuario")("Tipo")		
		SQLModifiUsuario = " UPDATE Usuarios "
		SQLModifiUsuario = SQLModifiUsuario + " SET Activo = 's'"
		SQLModifiUsuario = SQLModifiUsuario + " WHERE IdUsuario="&IdUsuario&""		
		adocon.execute(SQLModifiUsuario )
		RsIdUsuarioSearch = IdUsuario	
          end if
  #3 (permalink)  
Antiguo 27/06/2005, 22:56
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 19 años, 8 meses
Puntos: 0
Hola trasgukabi, entiendo lo que me comentas pero en si mi pregunta ya que vi todas las formas de rs.Close y no esta funcionando bien no se por que, lo que creo que falta es : ¿Combo validar si el rs esta abierto o no?

Por que si intento validar con not rs.eof me manda error, ¿existe otra forma de validar si esta abierto el objeto o no?, gracias...
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #4 (permalink)  
Antiguo 28/06/2005, 09:12
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
con If IsObject(rs) ??

Eso te devuelve un boolean que indica si es o no un objeto.. lo que no estoy seguro es si te devuelve FALSE cuando el objeto existió pero ya fue eliminado o cerrado
__________________
...___...
  #5 (permalink)  
Antiguo 28/06/2005, 11:29
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

Bueno, en mi experiencia, rs.Close falla cuando no tienes resultados en el objeto, o cuando hubo un error de bases de datos, entonces, bueno, la estructura correcta para correr esta clase de cosas, es asi:

Cita:
on error resume next
set rs = conn.Execute(sql)

if conn.Errors.Count = 0 then
if not rs.eof then

//Operaciones con el rs
//Cerrar el rs porque sabemos que tiene datos y esta correctamente abierto
rs.Close

else

//Rs vacio

end if

else

//Error en la consulta

end if

//liberar memoria
set rs = nothing
conn.close
set conn = nothing
Con esa estructura no deberías de tener ningun problema con los objetos, etc., si te fijas el rs.close correra solamente cuando realmente debe correr.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #6 (permalink)  
Antiguo 28/06/2005, 11:52
Avatar de trasgukabi  
Fecha de Ingreso: septiembre-2004
Mensajes: 2.749
Antigüedad: 19 años, 9 meses
Puntos: 18
quieres decir que da igual dejar un recordset abierto en el caso de que éste esté vacio? no creo.

y otra cosa. después de rs.open, si la consulta no ha fallado rs.close siempre funcionará, aunque esté vacío. No importa el hecho de que tenga datos o no, sino el hecho de que ese objeto se haya creado.

Y no quisiera que esto se convirtiera en "la discusión del referer II" por, favor
  #7 (permalink)  
Antiguo 28/06/2005, 11:55
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
referer II


Bueno, es parcialmente cierto lo del rs, en realidad me parece que depende del cursor que se utilice no se porque razon, pero si utilizas un cursor estatico y no regresa resultados, despues quieres cerrarlo, te arrojara error, si por el contrario utilizas un cursor dinamico, y pasa lo mismo, no regresara error, al menos asi ha sido en mi humilde experiencia.

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #8 (permalink)  
Antiguo 28/06/2005, 12:00
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola

Bueno, lo que pasa es que aqui no se trata de un rs.open, se trata de un set simple y sencillo

Cuando crear un objeto tipo Recordset, si, siempre tienes que cerrarlo, porque error, o no error, resultados o no resultados, siempre existe porque ya lo creaste, pero en este caso es un simple set que va a tomar los resultados de algo, y cuando no hay resultados, etc., este no contiene nada.

Esa es la diferencia, ademas este metodo es mucho menos pesado que un recordset.

Y en el caso actual de lo que se esta haciendo, es mejor este metodo y no un recordset con todo lo qe conlleva.
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #9 (permalink)  
Antiguo 28/06/2005, 12:02
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Cita:
Bueno, lo que pasa es que aqui no se trata de un rs.open, se trata de un set simple y sencillo
Es un recordset con un cursor estatico.

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #10 (permalink)  
Antiguo 28/06/2005, 12:05
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Esta bien.

Pero tiene muchas diferencias este SET a un OPEN, tanto en recursos, como en funcionalidades, como getRows por ejemplo, y radica en que no es Totalmente un Recordset, digamos, tan completo, no se como explicarlo, es como la version Light de un Recorset.

Suerte!! :-p
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #11 (permalink)  
Antiguo 28/06/2005, 12:10
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
No

Set solamente implica la creacion de un objeto, ya sea que instancies tu objeto explicitamente con una instruccion de este tipo:

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open consulta, ObjConn, 3, 3'*cursor, cerrojo

o

Set rs = Objconn.Execute(consulta)

En cualquiera de los dos casos, estas creando un recordset, la diferencia principal es que en la segunda opcion el recordset se abrira por default con cursor estatico, con lo cual, no puedes mas que ir hacia adelante, pero finalmente las dos opciones te traen un recordset, no puede ser de otra manera.
Precisamente por eso trabajas de la siguiente forma no importando como instancies tu recordset

rs.Propiedad

En el caso de GetRows es totalmente distinto porque no estas trabajando con el objeto recordset de ADO, sino con un vector que generaste a partir de el.


Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #12 (permalink)  
Antiguo 28/06/2005, 12:30
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Estoy de acuerdo...

Es un recordset con cursor estático.

Pero tu lo has explicado mejor...

Cita:
En el caso de GetRows es totalmente distinto porque no estas trabajando con el objeto recordset de ADO, sino con un vector que generaste a partir de el.
Yo dije

Cita:
y radica en que no es Totalmente un Recordset, digamos, tan completo, no se como explicarlo, es como la version Light de un Recorset.
Creo que quice decir lo mismo que tu, pero tu lo has explicado como se debe, y cierto que por lo que has dicho, con un set creas un objeto mucho mas ligero, que un recordset de ADO, y esas diferencias son a las que me referia, tanto en funcionalidades como en recursos, que ambos son lo "mismo", pero con muchas diferencias.

Bueno, creo que estamos de acuerdo

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #13 (permalink)  
Antiguo 28/06/2005, 12:36
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Fiu!

Pero todavia nos falta un poco de debate que no?
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #14 (permalink)  
Antiguo 28/06/2005, 12:52
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
jajaja

Claro que no, como hacer debate si estamos de acuerdo, solo que yo lo decia como para niños, y tu lo dijiste para gente grande... jajajaja

Saludos u_goldman....

Ya habra algo porque discutir en su momento... jajajajaja

Suerte!!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #15 (permalink)  
Antiguo 29/06/2005, 13:00
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 19 años, 8 meses
Puntos: 0
Una duda

De antemano agradesco los comentarios que colocaron en este post, Neuron_376 vi que pusiste:

Código:
 on error resume next
set rs = conn.Execute(sql)

if conn.Errors.Count = 0 then
	if not rs.eof then
	'Operaciones con el rs
	'Cerrar el rs porque sabemos que tiene datos y esta correctamente abierto
	rs.Close
	else
		'Rs vacio
	end if
else
	'Error en la consulta
end if
Yo estoy conectado y jalando la informacion de la siguiente forma:

Código:
Set adoCon = Server.CreateObject("ADODB.Connection") 
adoCon.Open "DSN=BDSistema;"
Set rs = Server.CreateObject("ADODB.Recordset")	
'por si pongo nuevos registros pongo lo siguiente
Const adOpenKeyset = 1
Const adLockOptimistic = 3

	SQLValidaIdUsuario = "SELECT * FROM usuarios WHERE IdUsuario="&IdUsuario&""
	rs.Open SQLValidaIdUsuario, adoCon	
	if not rs.eof  then
		'si exite registro has esto
	end if
De acuerdo a lo que colocaste tendira que poner?:

set rs = conn.Execute(sql)

en vez de?

Set rs = Server.CreateObject("ADODB.Recordset")

Y otra pregunta:

Cita:
if conn.Errors.Count = 0 then
if not rs.eof then
rs.Close
else
'en este caso no debo de cerrar el rs?
end if
Si si es fin de archivo o si no se encuntro lo requerido en el query no se habre el rs?, por que mi problema es que más adelante habro una y otra vez el RS, como lo pongo a continuacion.

rs.Open SQLValidaIdUsuario, adoCon

Por ello mi pregunta de si existe forma de validar:

if rs open then
rs.close
End if

Ahora u_goldman comento:

Cita:
pero si utilizas un cursor estatico y no regresa resultados, despues quieres cerrarlo, te arrojara error, si por el contrario utilizas un cursor dinamico, y pasa lo mismo, no regresara error
Si no existe forma de validar lo que pregunto me gustaria saber como lo pongo dinamico, acado el GetRows es poner el Rs de forma dinamica o que , gracias.

Gracias...
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #16 (permalink)  
Antiguo 29/06/2005, 13:04
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
rs.Open SQLValidaIdUsuario, adoCon,cursor,cerrojo

trata asi:

rs.Open SQLValidaIdUsuario, adoCon,3, 3

Y despues valida normalmente:

if rs.EOF then
'no hay resultados
else
'procesos
end if

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #17 (permalink)  
Antiguo 29/06/2005, 13:15
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 19 años, 8 meses
Puntos: 0
Gracias por contestar tan rapido, ahora...

Código:
if rs.EOF then
    'no hay resultados
    'al final sierro?
else
    'procesos
    ' ok, aqui si sierro?
end if
O con el cerrojo no es requerido el rs.close, gracias
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #18 (permalink)  
Antiguo 29/06/2005, 13:19
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
O sea, los posts que hemos puesto no han servido de nada???
Como que si con el cerrojo no es requerido?
El problema viene que cuando utilizas el metodo close del recordset te manda un error y la explicacion es que estabas tratando de cerrar un recordset estatico, cuando un recordset estatico no envia resultados, te arrojara un error si tratas de cerrarlo, no asi si utilizas un recordset dinamico.
O sea...si utilizas la instruccion que te puse, estas creando un recordset dinamico, ahora independientemente de que ese rs traiga resultados o no, lo puedes cerrar.
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #19 (permalink)  
Antiguo 29/06/2005, 13:27
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

Si, creo que a todo lo que me preguntaste es un si.

1.

Código PHP:
Set adoCon Server.CreateObject("ADODB.Connection"
adoCon.Open "DSN=BDSistema;"

'Esta línea no la necesitarias
'
Set rs Server.CreateObject("ADODB.Recordset")    

'por si pongo nuevos registros pongo lo siguiente
Const adOpenKeyset = 1
Const adLockOptimistic = 3

    SQLValidaIdUsuario = "SELECT * FROM usuarios WHERE IdUsuario="&IdUsuario&""


             '
Aquien lugar de openes el set.
    
'rs.Open SQLValidaIdUsuario, adoCon    

             set rs = adoCon.Execute(SQLValidaIdUsuario)

    if not rs.eof  then
        '
si exite registro has esto
    end 
if 
Y ya, en medio de todo eso puedes poner la seguridad de prevenir errores de bases de datos, como en la estructura que puse arriba.

2.

Código PHP:
if conn.Errors.Count 0 then
  
if not rs.eof then
    rs
.Close
  
else

  
'en este caso no debo de cerrar el rs?
  '
Haz una prueba donde si pruebas cerrarloclaro no debes tener ningun on error resume next para ver el errores posible que no te marque errorpero no es algo necesario si estas usando set en lugar de open

  end 
if

end if 
Por cierto, revisando mis scripts, yo hago esto para un select con recordset, de hecho, siempre lo uso para select solamente, cosas de paginacion

rs.Open strSql, conn, adOpenForwardOnly, adLockReadOnly, adCmdText

if not rs.eof

//todo
rs.close()

else

//no cierro el recordset

end if

No tengo ningun problema con memoria, fugas, seguridad, etc., es decir, esa estructura no me da problemas con el rs.close, lo cual me hace pensar que quizas no sea necesario poner el close si no obtuviste ningun resultados, pero eso no lo puedo asegurar.

Aun asi, en este caso actual Saruman, prefiero por mucho el set, es lo mejor para este caso. Bueno, viendo solamente el codigo que tienes y en lo que lo estas aplicando.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #20 (permalink)  
Antiguo 29/06/2005, 14:25
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 19 años, 8 meses
Puntos: 0
Sonrisa

Muy bien muchas gracias por sus comentarios, quiza hice preguntas medio lentas pero hace tiempo aprende que es mejor preguntar a quedarse con la duda y pues je je me aguante la pena y pregunte, voy a checar estos ejemplos que me pusieron, creo que con lo que me dieron es más que suficiente para lo que requiero,
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:38.