Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

FabianoSouza

Erro 500 ao chamar Recordset fora do loop

Recommended Posts

Este select está funcionando.

 

Dim rs, strSQL, numerador, var_nome_servico, var_icone_servico

strSQL=""

strSQL = strSQL &"SELECT"

strSQL = strSQL &" FavoritosURL, FavoritosCod, "

strSQL = strSQL &" REPLICATE('0', 6 - LEN(FavoritosCod)) AS RepeteN, "

strSQL = strSQL &" FavoritosCodRegistro, FavoritoTitulo, FavoritosDtCad, "

strSQL = strSQL &" MEU_BANCO.dbo.SERVICO.ServicoAlias, MEU_BANCO.dbo.SERVICO.ServicoIcone "

strSQL = strSQL &" FROM FAVORITOS INNER JOIN"

strSQL = strSQL &"MEU_BANCO.dbo.SERVICO ON MEU_BANCO.dbo.SERVICO.ServicoCod = FAVORITOS.FavoritosCodServico"

strSQL = strSQL &" WHERE "

strSQL = strSQL &"(FavoritosCodServico ='"&var_cod_servico&"') "

strSQL = strSQL &" AND "

strSQL = strSQL &" (FavoritosCodProp ='"&var_cod_prop&"')"

strSQL = strSQL &" ORDER BY FavoritosDtCad DESC"

 

Set rs= MM_conexao_STRING.Execute(strSQL)

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

rs.open strSQL,MM_conexao_STRING, 3, 3

 

 

E o loop que lista os registros é este.

 

 <% 
numerador= 0
While Not rs.EOF
numerador = numerador + 1
%>

<tr id="<%=rs("FavoritosCod")%>" class="favorito_tr_detalhe">

<td width="84%" height="27" id="<%=rs("FavoritosURL")%>" title="<%=rs("FavoritoTitulo")%>" onclick="link_simples(this.id)">
<%=numerador%><%Response.Write(". ")%><%=resumo(rs("FavoritoTitulo"),45)%> <%=rs("RepeteN")%><%=rs("FavoritosCodRegistro")%>
</td>
<td width="16%" align="center" class="favorito_td_detalhe" id="<%=rs("FavoritosCod")%>" onclick="remove_iten_fav(id);"><img src="/Imagens/ico288.gif" width="16" height="16" title="Remover"/></td>
</tr>
<% 
 rs.MoveNext()
 Wend
 rs.Close
 Set rs=Nothing
 MM_conexao_STRING.Close
%>  

 

O erro ocorre somente no caso de não existir registro (o EOF e BOF) usando JOIN. Se o rs for EOF ou BOF mas sem JOIN na consulta não ocorre o erro.

 

Se eu chamar fora do loop algum item do recordset que faça parte do banco MEU_BANCO como por exemplo, MEU_BANCO.dbo.SERVICOS.ServicoAlias, ocorre erro 500.

Até passei o <%=rs("ServicoAlias")%> para uma variável e escrevo a variável ao invés do rs direto. Mas continua dando o erro.

Mas se chamar um campo do banco MEU_BANCO dentro do loop tudo funciona direitinho.

 

 

O que acontece?

Compartilhar este post


Link para o post
Compartilhar em outros sites

desabilite a função de exibir mensagens de erros HTTP amigáveis no browser. para podermos ver o numero real do erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta opção está desabilitada (veja a imagem). Mas ainda assim só aparece erro 500.

 

E lá no IIS já esta marcado como True para enviar erros ao navegador. O que mais faço para o navegador exibir os erros?

 

erro500.png

 

Opa...erro 500 resolvido. Vou compartilhar a solução.

 

Se o navegador já estiver com a opção Mostrar mensagem de erro HTTP amigáveis desmarcada e se lá o IIS estiver marcado como True para enviar erros ao navegar e se ainda assim continua aparecendo o erro genérico 500 este link resolve o problema Link MSDN

 

Bom, agora vamos retornar o meu problema.

 

Xanburzum, o erro é este

 

ADODB.Field erro '80020009'

 

BOF ou EOF são verdadeiros, ou o registro atual foi excluído. A operação solicitada pelo aplicativo requer um registro atual.

 

/App/Favoritos/favoritos_lista.asp, linha 0

 

Solução encontrada.

 

Percebi que usar o Response.End() pode quebrar o maior galho para tratar o erro EOF.

 

Algo assim

 

<%
If rs.BOF OR rs.EOF  then 
Response.End()
End if
%>

Assim o processamento encerra, ou seja, não vai dar erro EOF porque o recordset que estiver no resto do página não será chamado.

 

Agora pergunto aos experts. Dá pra tratar este tipo de erro desta forma ou isso pode gerar problemas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A causa mais provável é que não há registo que satisfaçam o critério. Por exemplo, isso iria acontecer com o código assim:

 

<% 
   set conn = CreateObject("ADODB.Connection") 
   conn.open <connection string> 
   set rs = conn.execute(<sql>) 
   do while not rs.eof 
       ' process 
       rs.movenext 
   loop 
   ' ... 
%>

 

Para evitar esse erro de "explodir" sua página ASP, é preciso prender para o caso onde não há registros estão lá. A maneira mais fácil de fazer isso é adicionando as seguintes linhas:

 

<% 
   set conn = CreateObject("ADODB.Connection") 
   conn.open <connection string> 
   set rs = conn.execute(<sql>) 
   if not rs.eof then 
       do while not rs.eof 
           ' process 
           rs.movenext 
       loop 
   else 
       response.write "Sem resultados." 
   end if 
   ' ... 
%>

 

Se você está certo de que há resultados, você pode verificar se a versão do MDAC é a mais recente.

 

Outra possível razão é que você está usando um procedimento armazenado que opera em uma tabela temporária, ou uma operação row-affecting antes de sua declaração de select. Para contornar este problema, emita o seguinte no início do seu procedimento armazenado:

e mude a linha

rs.open strSQL,MM_conexao_STRING, 3, 3

 

para

rs.open strSQL,MM_conexao_STRING, 1, 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.