Måste ställa en , säkert ganska enkel fråga :) Nej du får loopa igenom alla fält och kolla om det du vill ha finns. Du kan ju göra en inline error check... Gjorde en liten test: kollade precis själv prestandanIf-Sats som känner av om tbl innehåller ett fält m
Kan man få en if-sats att kolla om rs överhuvudtaget innehåller ett fält med just det namnet?Annars hoppa över det?
Det gäller vid upptagandet av ett tomt rs, så ska jag spara till rs("active") i vissa tomma rs men inte i andra.Sv: If-Sats som känner av om tbl innehåller ett fä
/johan/Sv: If-Sats som känner av om tbl innehåller ett fä
dvs
<code>
on error resume next
vTest = rs.fields("kolumn")
if err.number = 3265 then
' Kolumnen fanns inte
elseif err.number <> 0 then
' Annat fel uppstod
else
' Kolumn fanns
end if
</code>Loop vs Fields()
'##############################################
Option Explicit
Private Sub Form_Load()
Dim Conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim StartTime As Single
Dim Index As Integer
Dim vReturn As Boolean
Dim vField As ADODB.Field
Set Conn = New ADODB.Connection
Conn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind;Data Source=127.0.0.1"
Set rs = New ADODB.Recordset
rs.Open "Employees", Conn, adOpenStatic, adLockReadOnly
StartTime = Timer
For Index = 1 To 10000
vReturn = FieldExist(rs, "NotExist")
Next
Debug.Print "FieldExist(Fält saknas):" & Timer - StartTime
StartTime = Timer
For Index = 1 To 10000
vReturn = FieldExistByErr(rs, "NotExist")
Next
Debug.Print "FieldExistByErr(Fält saknas):" & Timer - StartTime
StartTime = Timer
For Index = 1 To 10000
vReturn = FieldExist(rs, "PhotoPath")
Next
Debug.Print "FieldExist(Fält existerar):" & Timer - StartTime
StartTime = Timer
For Index = 1 To 10000
vReturn = FieldExistByErr(rs, "PhotoPath")
Next
Debug.Print "FieldExistByErr(Fält existerar):" & Timer - StartTime
End Sub
Public Function FieldExist(Recordset As ADODB.Recordset, FieldName As String) As Boolean
Dim fldTemp As ADODB.Field
For Each fldTemp In Recordset.Fields
If fldTemp.Name = FieldName Then
FieldExist = True
Exit For
End If
Next
End Function
Public Function FieldExistByErr(Recordset As ADODB.Recordset, FieldName As String) As Boolean
On Error Resume Next
Dim fldTemp As ADODB.Field
Set fldTemp = Recordset.Fields(FieldName)
If Err.Number = 0 Then
FieldExistByErr = True
End If
End Function
'##############################################
Fick följande resultat:
FieldExist(Fält saknas):2,765625
FieldExistByErr(Fält saknas):6,328125
FieldExist(Fält existerar):2,742188
FieldExistByErr(Fält existerar):0,1601563
Slutsats:
En Loop är snabbare om fältet saknas. Men långsammare om det existerar.
Går ju att ifrågasätta.Sv: Loop vs Fields(
det här är vid 100 000 loopar
skillnaden syns rätt bra i de antalen ..
men antar att det beror lite granna på vad som är troligast..
intressant att det tar så lång tid för systemet att få upp ett felmeddelande om fältet inte finns .. Måste ha ngt med sökalgoritmen bakom filed collection att göra ..
FieldExist(Fält saknas):9,875
FieldExistByErr(Fält saknas):19,59766
FieldExist(Fält existerar):10,09766
FieldExistByErr(Fält existerar):0,7304688