Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

Crie objetos Field explicitamente quando fizer loop em grandes Recordsets

 

Sempre que você acessa um campo de um recordset, você incorre em uma pequena sobrecarga na performance. Veja, por exemplo, o seguinte trecho de código:

Dim rs As New ADODB.Recordset
rs.Open "SELECT Sobrenome, Nome FROM Autores", "DSN=pubs", , , adCmdText

Do Until rs.EOF
    List1.AddItem rs("Sobrenome") & ", " & rs("Nome")
    rs.MoveNext
Loop
rs.Close

As referências aos campos da tabela dentro do bloco Do...Loop são tratadas pelo ADO da seguinte forma:

List1.AddItem = rs.Fields("Sobrenome").Value & ", " _
    & rs.Fields("Nome").Value

A sobrecarga no desempenho vem do fato de que o ADO precisa localizar os campos referenciados na coleção Fields. Você pode tornar seu código de três a quatro vezes mais rápido criando explicitamente objetos Field antes de executar o loop, assim:

Dim rs As New ADODB.Recordset
Dim fldNome As ADODB.Field, fldSobreNome As ADODB.Field

rs.Open "SELECT Sobrenome,Nome FROM Autores", "DSN=pubs", , , adCmdText

' cria os dois objetos Field que referenciam aqueles dois campos
Set fldNome = rs.Fields("Nome")
Set fldSobrenome = rs.Fields("Sobrenome")

Do Until rs.EOF
    'aqui você usa a propriedade Value, default do objetos Field
    List1.AddItem fldSobrenome & ", " & fldNome
    rs.MoveNext
Loop
rs.Close

Contudo, tenha em mente que fazer um loop em todos os registros de um recordset é, raramente, a sua opção mais rápida. Por exemplo, neste caso particular, você pode povoar a ListBox mais rápido usando a seguinte abordagem, que também move parte do trabalho para o servidor:

Dim rs As New ADODB.Recordset
Dim varArray() As Variant
Dim i As Long

' Deixe o SQL Server concatenar as strings
rs.Open "SELECT Sobrenome+', '+Nome FROM Autores", _
    "DSN=pubs", , , adCmdText
' obtém todas as strings numa operação
varArray() = rs.GetRows()
' preenche a ListBox
For i = 0 To UBound(varArray, 2)
    List1.AddItem varArray(0, i)
Next