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&""
'Aqui, en lugar de open, es 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?
'R = Haz una prueba donde si pruebas cerrarlo, claro no debes tener ningun on error resume next para ver el error, es posible que no te marque error, pero 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!!