Skip to main content
Code Review

Return to Answer

For Each field In adoRecordset.fields
 If grabFieldName Then result.AddFieldName LCase$(Coalesce(field.name, vbNullString))
Next
For Each field In adoRecordset.fields
 If grabFieldName Then result.AddFieldName LCase$(Coalesce(field.name, vbNullString))
Next
If grabFieldNames Then
 For Each field In adoRecordset.fields
 result.AddFieldName LCase$(Coalesce(field.name, vbNullString))
 Next
End If
If grabFieldNames Then
 For Each field In adoRecordset.fields
 result.AddFieldName LCase$(Coalesce(field.name, vbNullString))
 Next
End If
Public Sub AddFieldName(name As String)
 this.FieldNames.Add name
End Sub
Public Sub AddFieldName(name As String)
 this.FieldNames.Add name
End Sub
Private nameIndices As New Dictionary
Private nameIndices As New Dictionary
Public Sub AddFieldName(ByVal name As String)
 
 Static nameInstances As New Dictionary
 
 Dim localName As String
 localName = LCase$(name)
 
 If nameIndices.ContainsKey(localName) Then
 
 If nameInstances.ContainsKey(localName) Then
 nameInstances(localName) = nameInstances(localName) + 1
 Else
 nameInstances.Add localName, 1
 End If
 
 AddFieldName name & nameInstances(localName) 'recursive call
 
 Else
 this.FieldNames.Add localName
 nameIndices.Add localName, this.FieldNames.Count - 1
 End If
 
End Sub
Public Sub AddFieldName(ByVal name As String)
 
 Static nameInstances As New Dictionary
 
 Dim localName As String
 localName = LCase$(name)
 
 If nameIndices.ContainsKey(localName) Then
 
 If nameInstances.ContainsKey(localName) Then
 nameInstances(localName) = nameInstances(localName) + 1
 Else
 nameInstances.Add localName, 1
 End If
 
 AddFieldName name & nameInstances(localName) 'recursive call
 
 Else
 this.FieldNames.Add localName
 nameIndices.Add localName, this.FieldNames.Count - 1
 End If
 
End Sub
Public Function FieldNameIndex(ByVal name As String) As Long
 
 Dim i As Long
 If nameIndices.TryGetValue(name, i) Then
 FieldNameIndex = i
 Else
 FieldNameIndex = -1
 End If
 
End Function
Public Function FieldNameIndex(ByVal name As String) As Long
 
 Dim i As Long
 If nameIndices.TryGetValue(name, i) Then
 FieldNameIndex = i
 Else
 FieldNameIndex = -1
 End If
 
End Function
For Each field In adoRecordset.fields
 If grabFieldName Then result.AddFieldName LCase$(Coalesce(field.name, vbNullString))
Next
If grabFieldNames Then
 For Each field In adoRecordset.fields
 result.AddFieldName LCase$(Coalesce(field.name, vbNullString))
 Next
End If
Public Sub AddFieldName(name As String)
 this.FieldNames.Add name
End Sub
Private nameIndices As New Dictionary
Public Sub AddFieldName(ByVal name As String)
 
 Static nameInstances As New Dictionary
 
 Dim localName As String
 localName = LCase$(name)
 
 If nameIndices.ContainsKey(localName) Then
 
 If nameInstances.ContainsKey(localName) Then
 nameInstances(localName) = nameInstances(localName) + 1
 Else
 nameInstances.Add localName, 1
 End If
 
 AddFieldName name & nameInstances(localName) 'recursive call
 
 Else
 this.FieldNames.Add localName
 nameIndices.Add localName, this.FieldNames.Count - 1
 End If
 
End Sub
Public Function FieldNameIndex(ByVal name As String) As Long
 
 Dim i As Long
 If nameIndices.TryGetValue(name, i) Then
 FieldNameIndex = i
 Else
 FieldNameIndex = -1
 End If
 
End Function
For Each field In adoRecordset.fields
 If grabFieldName Then result.AddFieldName LCase$(Coalesce(field.name, vbNullString))
Next
If grabFieldNames Then
 For Each field In adoRecordset.fields
 result.AddFieldName LCase$(Coalesce(field.name, vbNullString))
 Next
End If
Public Sub AddFieldName(name As String)
 this.FieldNames.Add name
End Sub
Private nameIndices As New Dictionary
Public Sub AddFieldName(ByVal name As String)
 
 Static nameInstances As New Dictionary
 
 Dim localName As String
 localName = LCase$(name)
 
 If nameIndices.ContainsKey(localName) Then
 
 If nameInstances.ContainsKey(localName) Then
 nameInstances(localName) = nameInstances(localName) + 1
 Else
 nameInstances.Add localName, 1
 End If
 
 AddFieldName name & nameInstances(localName) 'recursive call
 
 Else
 this.FieldNames.Add localName
 nameIndices.Add localName, this.FieldNames.Count - 1
 End If
 
End Sub
Public Function FieldNameIndex(ByVal name As String) As Long
 
 Dim i As Long
 If nameIndices.TryGetValue(name, i) Then
 FieldNameIndex = i
 Else
 FieldNameIndex = -1
 End If
 
End Function
replaced http://codereview.stackexchange.com/ with https://codereview.stackexchange.com/
Source Link
Source Link
Mathieu Guindon
  • 75.5k
  • 18
  • 194
  • 467

This loop (in SqlResult.Create):

For Each field In adoRecordset.fields
 If grabFieldName Then result.AddFieldName LCase$(Coalesce(field.name, vbNullString))
Next

will still iterate all fields even though grabFieldName is False. And since grabFieldName will only be True for the first record, why not just do it like this - and the flag should be called grabFieldNames, since the code is "grabbing" all field names:

If grabFieldNames Then
 For Each field In adoRecordset.fields
 result.AddFieldName LCase$(Coalesce(field.name, vbNullString))
 Next
End If

Speaking of AddFieldName, this implementation:

Public Sub AddFieldName(name As String)
 this.FieldNames.Add name
End Sub

Might work for most scenarios, but then if you want to have a Dictionary that maps field names to an index for more efficient field name lookups, a query like SELECT NULL AS Test, NULL AS Test will blow it up, since dictionary keys must be unique.

Given this field (see Dictionary implementation here):

Private nameIndices As New Dictionary

AddFieldName could look like this:

Public Sub AddFieldName(ByVal name As String)
 
 Static nameInstances As New Dictionary
 
 Dim localName As String
 localName = LCase$(name)
 
 If nameIndices.ContainsKey(localName) Then
 
 If nameInstances.ContainsKey(localName) Then
 nameInstances(localName) = nameInstances(localName) + 1
 Else
 nameInstances.Add localName, 1
 End If
 
 AddFieldName name & nameInstances(localName) 'recursive call
 
 Else
 this.FieldNames.Add localName
 nameIndices.Add localName, this.FieldNames.Count - 1
 End If
 
End Sub

This way the first Test field will be called Test, and the 2nd one will be called Test1, ensuring uniqueness of the field names. This could be quite surprising to the calling code, though, but selecting identically named columns shouldn't happen very often.

The FieldNameIndex function can then look like this:

Public Function FieldNameIndex(ByVal name As String) As Long
 
 Dim i As Long
 If nameIndices.TryGetValue(name, i) Then
 FieldNameIndex = i
 Else
 FieldNameIndex = -1
 End If
 
End Function
default

AltStyle によって変換されたページ (->オリジナル) /