Een sterk hulpmiddel voor het opvragen van gegevens uit een databank en verdere verwerking ervan is de “resultset”, de resultaatset van de opvraging. Een opvraging bestaat meestal uit een tekstlijn met een SQL query. Die kan op voorhand opgebouwd worden in een variabele.
Er wordt trouwens aangeraden om eerder de echte variabelen mee te geven als parameters.( zie Databank aanspreken..)
sRequest = "SELECT * FROM &1 LIMIT &2"
TRY myResult = db.Exec(sRequest, "test", "2000")
Met de resultset kan je dan hetvolgende:
- Kijken hoeveel records of resultaatrijen er zijn:
PRINT myResult.Count
- bewegen met de pointer of index:
Die begint te tellen bij 0 en kan gevolgd worden met:
PRINT myResult.Index
Naar een bepaalde rij:
myResult.MoveTo(iRow)
Naar een relatieve rij bewegen met de pointer: eerste, laatste, volgende, vorige
myResult.MoveFirst()
myResult.MoveLast()
myResult.MoveNext()
myResult.MovePrevious()
Een veld uit het huidige record aanspreken:
PRINT myResult!fld_name
Omdat het een “enumerable” resultset is hoef je zelf niet te tellen, maar kan je FOR EACH gebruiken:
FOR EACH myResult
PRINT myResult!fld_id & " - " & myResult!fld_name
NEXT
(als de databank-tabel de velden fld_id en fld_name bevat )
- De inhoud van een veld opvragen om in te vullen in bv een TableView:
TableView1.Data.Text = myResult[sVeldnaam]
Extra interessant zijn de “subcollecties”: bv de beschikbare velden:
myResult.Fields[]
Die zijn “enumerable”: dwz te gebruiken met FOR EACH. Je moet wel een “tellervoorwerp” hebben; bv een veld.
DIM myField AS Field
FOR EACH myField in myResult.Fields
‘ …
NEXT
Voorbeeld:
PUBLIC SUB fillLsbxTableFieldsForEach()
'
' try to make a better fillListbox by using enumerated type
'
DIM iInd AS Integer
DIM sTableAndFields AS String
DIM hField AS Field
DIM hTable AS Table
'
DEBUG "Database:" & lsbxDatabases.Current.Text
WITH $hConDb
.Name = lsbxDatabases.Current.Text
END WITH
$hConDb.Close
$hConDb.Open
TRY $hRes = $hConDb.Exec("SHOW TABLES")
IF ERROR
Message.Error(Error.Text, "ok")
ELSE
DEBUG $hRes.Count
$hRes.MoveFirst
lsbxDbTables.Clear
FOR EACH hTable IN $hConDb.Tables
'[$hRes[Str($hRes.Fields[0].Name)]]
WITH hTable
DEBUG .Name
sTableAndFields = .Name & "="
END WITH
FOR EACH hField IN hTable.Fields
WITH hField
'DEBUG .Name
sTableAndFields &= .Name & "+"
END WITH
NEXT
lsbxDbTables.Add(sTableAndFields)
NEXT
ENDIF
'
END
Upd 3/11/2010: index start op 0.