Database opvraging met result set

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.