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.