Ir para conteúdo

POWERED BY:

Arquivado

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

xanburzum

Melhorar o desempenho de carregamento de um ComboBox / ListBox

Recommended Posts

Para melhorar o desempenho de carregamento de um ListBox ou ComboBox usando ASP para um banco de dados SQL Server, tente transferir o processamento para o servidor SQL Server e usar os truques no ADO 2.5

 

Normalmente, para preencher uma caixa lista Combo / o seguinte código semelhante é utilizado:

 

<%Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open Application(cn_string)	

If cn.State > 0 
    strSQL = "SELECT ID, NAME FROM tblEmployees ORDER BY NAME"
Set rs = cn.Execute(strSQL)   
 If rs.State > 0
Response.Write "<SELECT ID=cbo name=cbo>"   
     Do While Not rs.EOF         
   Response.Write "<OPTION ID=" & rs("ID") & ">" & _   
rs("Name") & "</OPTION>"    
        rs.MoveNext  
      Loop
Response.Write "</SELECT>"   
     rs.Close 
   End If	  
      Set rs = Nothing 
   cn.Close
End If
Set cn = Nothing%>

Este método coloca todo o processamento para o servidor IIS e exige várias idas ao servidor para preencher o combo / caixa de lista.

 

Para melhorar o desempenho da lista ou caixa de combinação dos seguintes métodos SQL e ADO pode ser utilizado:

 

<%Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open Application(cn_string)	
If cn.State > 0 	
  strSQL = "SELECT '<OPTION=' + Cast(ID as Varchar(10)) + '>' + NAME + '</OPTION>'" 
  strSQL = strSQL & " FROM tblEmployees ORDER BY NAME"  
  Set rs = cn.Execute(strSQL)
If rs.State > 0 

        Response.Write "<SELECT ID=cbo name=cbo>"   
     If Not rs.EOF and Not rs.EOF Then 
           Response.Write rs.GetString(2, -1)    
    End If
Response.Write "</SELECT>"    
    rs.Close
    End If	
        Set rs = Nothing  
  cn.Close
End If
Set cn = Nothing%>

A primeira coisa que fiz foi formatar a cadeia de SQL para que apenas uma única coluna sendo devolvida ao conjunto de registros, em seguida, foi utilizado o método ADO "GetString" basicamente para concatenar todo o resultado a ser retornado em uma longa seqüência. Isso na verdade escreve todas as opções para o combo / caixa lista em uma chamada para os dados seguinte. O desempenho é muito melhorado.

 

Um projeto que usei para preencher 4000 item listbox deve carregar em 45 segundos, utilizando o primeiro método acima e em 3 segundos, utilizando o método recomendado acima. AUMENTO DE 1500% EM EXECUÇÃO!

 

Nota: Para usar esse método com o SQL Server, você constrói isso como uma seqüência e, portanto, todos os campos numéricos contidos com a seqüência que você está criando deve ser convertido em strings. No SQL Server o método CAST é a maneira mais fácil de fazer isso.

 

Esta é a etapa de transferir o processamento de volta para o SQL Server (ou qualquer banco de dados)

 

<%' Este é o ID do item que está a ser padrão
lngDefaultID = 123 
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open Application(cn_string)	
If cn.State > 0 
   strSQL = "SELECT '<OPTION ' +"    strSQL = strSQL & "Case "    
strSQL = strSQL & "   WHEN ID = " & lngDefaultID & " THEN 'selected' "  
strSQL = strSQL & "   ELSE '' "  
  strSQL = strSQL & "END + ' value=' + CAST(ID AS VARCHAR(10)) + '>' + "  
  strSQL = strSQL & "NAME +'</OPTION>' FROM tblEmployees ORDER BY NAME"  
  Set rs = cn.Execute(strSQL)
If rs.State > 0 
       Response.Write "<SELECT ID=cbo name=cbo>"   
     If Not rs.EOF and Not rs.EOF Then   
         Response.Write rs.GetString(2, -1)    
    End If  
      Response.Write "</SELECT>"  
      rs.Close
    End If	     
   Set rs = Nothing  
  cn.Close
End If
Set cn = Nothing%>

Como você pode ver acima, temos o comando T-SQL "case" que testa o ID sendo igual ao valor que é inserido na string. Quando a identificação é igual ao DefaultID , ele adiciona a palavra "selecionados" em que a única linha OPTION e todo o resto são opções padrão. No Oracle a mesma coisa pode ser realizada com um comando DECODE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

11ª Regra

 

É proibido qualquer tipo plágio, ou seja, a postagem de conteúdo que não seja de sua autoria sem citar a fonte. Caso isto ocorra o tópico/mensagem será excluído e o membro advertido via MP. Havendo reincidência o membro será julgado pelos Administradores, estando sujeito a ser suspenso de 1 a 30 dias ou banido, a critério da administração.

 

 

 

 

 

poste a fonte proxima vez

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenho varios códigos, onde muitas vezes nao tenho a fonte, se souber e puder contribuir para o forum, poste a fonte...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, boa

 

veja, tem como fazer isso com mysql?

 

eu testei de várias formas e não consegui! :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estava vendo, isso só é possivel com ADO 2.5 né, tentei usar só no ASP e dá erro [:(]

 

Teria como fazer isso só no ASP?

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.