- 2.6k
- 2
- 15
- 36
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
Given this field (see Dictionary implementation here Dictionary implementation here):
Given this field (see Dictionary implementation here):
Given this field (see Dictionary implementation here):
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