[ASP.NET] Manieren om controls op te vullen met db-gegevens*

Pagina: 1
Acties:

  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Stel je even een form voor met meerdere dropdownlist controls erop.
Deze dropdownlist controls worden herhaald, en de gebruiker kan hiermee verschillende keuzes maken. De dropdownlists worden gevuld vanuit een database.

Voorbeeld:
dropdownlist1 (keuze1, keuze2, keuze3, keuze4)
dropdownlist2 (keuze1, keuze2, keuze3, keuze4)
dropdownlist3 (keuze1, keuze2, keuze3, keuze4)
dropdownlist4 (keuze1, keuze2, keuze3, keuze4)

De inhoud van de dropdownlist controls is dus steeds hetzelfde. De data wordt met een sproc uit de database gehaald, gaat allemaal prima. In de Page_Load event wordt de BindData() functie aangeroepen.

Ik had het dus zo opgelost, met het oog op slechts een database retrieve:
Private Sub BindData()

Dim Choices As New ChoicesDB()
Dim rsChoices As SqlDataReader = Choices.getChoices()

ddlChoice1.DataSource = rsChoices
ddlChoice1.DataBind()
ddlChoice2.DataSource = rsChoices
ddlChoice2.DataBind()
ddlChoice3.DataSource = rsChoices
ddlChoice3.DataBind()
ddlChoice4.DataSource = rsChoices
ddlChoice4.DataBind()

End Sub

De grap is nu dat dit voor de eerste ddl goed gaat, maar bij het binden van de tweede ddl, roept ie dat de rsChoices aan het einde van de recordset is.

Zit ik nu in de verkeerde oplossingsrichting te denken?

Een file op de A12 is nooit grappig...


Verwijderd

Ik weet niet of je voorheen VBScript met ado programmeerde, maar de SqlDataReader is het .NET equivalent van een ADO recordset met read-only lock en forward only cursor (Firehose cursor) . Het meest typerende hiervan is dat je hem alleen maar eenmalig van begin tot eind kan uitlezen (door .Read() methode aan te roepen). Na het eenmalig uitlezen is de datareader End-Of-File (EOF) en kan je er niet nog een dropdown mee vullen. De meest optimale manier voor dit doel is een DataTable in het Cache object te stoppen met een functie om hem daar uit te halen. De functie kijkt eerst of het Cache item niet null is, want het cache wordt na verloop van tijd geleegd om ruimte te maken voor andere data als de gereserveerde ruimte op is. (Je kan veel instellen qua expiration maar als je simpel zegt: Cache["DataTableForDropDown"] = dtDdlTable ofzoiets weet je niet wanneer het item gerecycled wordt.
Dus: ander datatype teruggeven uit "Choises" object: een datatable, dataset of array of IEnumerable teruggeven, een collectie waar je steeds opnieuw bovenaan kan beginnen.

  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Dank voor het meedenken. Ook handig dat ik geen titel aan deze post heb gegeven :?

Wat volgens mij ook een oplossing zou kunnen zijn is gebruik te maken van een array waar ik de boel in mik, en dit aan een ddl te hangen.

Een file op de A12 is nooit grappig...


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 10:24

gorgi_19

Kruimeltjes zijn weer op :9

MrHighStone schreef op 26 januari 2003 @ 15:48:
Wat volgens mij ook een oplossing zou kunnen zijn is gebruik te maken van een array waar ik de boel in mik, en dit aan een ddl te hangen.
Dat zegt hij toch ook?

[ Voor 17% gewijzigd door gorgi_19 op 26-01-2003 15:57 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:26
Een datareader is een read only en forward only object om door data te lopen.
Zoals QSharp zegt, kan je dat misschien beter met een DataSet of DataTable doen.

Een datareader gebruikt een connectie exclusief, dwz dat je geen meerdere datareaders op hetzelfde moment open kunt hebben die dezelfde connectie gebruiken.
Wat jij dus zou moeten doen, is iedere keer de datareader sluiten en opnieuw te openen als je dezelfde gegevens aan een dropdownlist wilt hangen.
Daarom is het toch beter om die gegevens één keer in een DataSet in te lezen, en dan die dataset als datasource te gebruiken bij het binden van de data.


titel gemod. :Y)

https://fgheysels.github.io/


  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
dan zou ik graag de interface naar de getChoices functie hetzelfde houden. Deze blijft dus een datareader teruggeven. Zou ik dit ding dan in een dataset kunnen gooien of praat ik nu...

Een file op de A12 is nooit grappig...

Pagina: 1