[VB.NET] Listbox & Database

Pagina: 1
Acties:

  • Lilacrazor
  • Registratie: Juni 2001
  • Laatst online: 23-12-2025
Hey mensen!

Ik heb een probleempje met Visual Basic.NET 2003. Om het meteen wat duidelijker te maken het volgende plaatje:

Afbeeldingslocatie: http://tinypic.com/ivjn1g.jpg

Links heb ik een Listbox met de betreffende functie. Rechts zijn 3 vakken genaamd: Activiteit, Resultaat en Toelichting. Aan de linkerkant zie je de database structuur (Interbase). Nu is het de bedoeling dat wanneer je links een functie aanclickt de uitleg rechts komt te staan. Het lijkt niet moeilijk, maar voor een beginneling zoals mij (bijna) onmogelijk. Met de volgende code kom ik al een heel eind, alleen ben ik wat vergeten. Nu maakt het niet uit wat je links selecteerd, rechts komt altijd hetzelfde. Is het zo dat ik dit op moet lossen in de qeury of met behulp van Listbox.SelectedItem?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub Listbox_SelectedIndexChanged_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox.SelectedIndexChanged
        Dim functiekeuze, cmd As String
        Dim recordcount As Integer
        Dim table5 As New DataTable

        functiekeuze = Listbox.SelectedItem

        Try

            OleDbConnection1.Open()

            'Beginen van opvragen informatie uit de database

            cmd = "SELECT * FROM TAKENCLUSTER"
            OleDbDataAdapter1.SelectCommand.CommandText = cmd

            recordcount = OleDbDataAdapter1.Fill(table5)

            If recordCount <> 0 Then
                tbActiviteit.Text = CStr(table5.Rows(0)(3))
                tbResultaat.Text = CStr(table5.Rows(0)(4))
                tbToelichting.Text = CStr(table5.Rows(0)(5))
            End If

        Finally
            OleDbConnection1.Close()
        End Try
    End Sub


Bedankt alvast voor de moeite :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
code:
1
cmd = "SELECT * FROM TAKENCLUSTER"

Uhm... ik zou eens een WHERE clause toevoegen zodat je alleen het benodigde record ophaalt in plaats van ALLE records uit de tabel (waarvan je trouwens dus alleen maar het eerste "weergeeft" in je texboxes). Die WHERE clause geef je dan natuurlijk het geselecteerde item uit de listbox mee (een ID of iets dergelijks).

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

RobIII schreef op dinsdag 20 december 2005 @ 01:09:
code:
1
cmd = "SELECT * FROM TAKENCLUSTER"

Uhm... ik zou eens een WHERE clause toevoegen zodat je alleen het benodigde record ophaalt in plaats van ALLE records uit de tabel (waarvan je trouwens dus alleen maar het eerste "weergeeft" in je texboxes). Die WHERE clause geef je dan natuurlijk het geselecteerde item uit de listbox mee (een ID of iets dergelijks).
Dan doe je bij elke selectionchanged een nieuwe query... Het lijkt me beter om bij initialisatie de hele recordset op te halen en ergens op te slaan; bij een index-changed haal je daar dan de goede waarde uit.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 06-10-2025

pjvandesande

GC.Collect(head);

Verwijderd schreef op dinsdag 20 december 2005 @ 09:21:
[...]

Dan doe je bij elke selectionchanged een nieuwe query... Het lijkt me beter om bij initialisatie de hele recordset op te halen en ergens op te slaan; bij een index-changed haal je daar dan de goede waarde uit.
In je ctor (in VB de init) is het niet zo slim om die data op te gaan halen. Maak hiervoor een apparte method die je eerst aanroep voordat je het Form/Usercontrol toont. Dus:

Visual Basic .NET:
1
2
3
Dim mainForm As New FrmMain()
mainForm.InitializeData()
mainForm.Show()


De method InitializeData haalt de data van de databank en bewaard dit in een DataSet of een Custom collection.

Verwijderd

questa schreef op dinsdag 20 december 2005 @ 09:56:
[...]


In je ctor (in VB de init) is het niet zo slim om die data op te gaan halen. Maak hiervoor een apparte method die je eerst aanroep voordat je het Form/Usercontrol toont. Dus:

Visual Basic .NET:
1
2
3
Dim mainForm As New FrmMain()
mainForm.InitializeData()
mainForm.Show()


De method InitializeData haalt de data van de databank en bewaard dit in een DataSet of een Custom collection.
Ja oke, ik zit niet in VB dus daar had ik niet aan gedacht, maar dat zijn ook maar details. Het gaat erom dat je niet bij elke indexchanged een dbase query wil doen...

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:46
Verwijderd schreef op dinsdag 20 december 2005 @ 10:13:
[...]

Ja oke, ik zit niet in VB dus daar had ik niet aan gedacht, maar dat zijn ook maar details. Het gaat erom dat je niet bij elke indexchanged een dbase query wil doen...
Dat hangt van de situatie af. In dit geval wil je dat misschien niet doen, maar stel dat je in je listbox 1000 items hebt, dan wil je niet voor al die 1000 items de details in één keer gaan ophalen bij het opstarten.
Wellicht heb je ze toch niet allemaal nodig, en, wie weet is er wel een andere gebruiker bezig met dingen te wijzigen op dat moment, dus, als jij alles al geladen hebt bij het opstarten, ben je niet zeker dat je met de recentste data werkt.

Maar, het hangt dus van situatie tot situatie af, van het type gegevens, aantal, etc...

[ Voor 21% gewijzigd door whoami op 20-12-2005 10:16 ]

https://fgheysels.github.io/


  • Lilacrazor
  • Registratie: Juni 2001
  • Laatst online: 23-12-2025
Bedankt voor de reacties! Tot op heden is het nog niet gelukt. De database was o.a. fout. Bepaalde koppeltabellen waren niet aanwezig. De huidige database zie je weer aan de linkerkant.

Afbeeldingslocatie: http://tinypic.com/ixdov6.jpg

De code is nu veranderd en een WHERE clausule is toegevoegd. De code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Private Sub Listbox_SelectedIndexChanged_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox.SelectedIndexChanged
        Dim functiekeuze, cmd As String
        Dim recordcount As Integer
        Dim table As New DataTable

        functiekeuze = Listbox.SelectedItem

        Try

            OleDbConnection1.Open()

            'Beginnen van opvragen informatie uit de database

            cmd = "SELECT * FROM FUNCTIE, TAKENCLUSTER WHERE TAKENFUNC.TAKEN_NAAM = TAKENCLUSTER.TAKEN_NAAM" _
            & "AND FUNC_NAAM ='" & functiekeuze & "'"
            OleDbDataAdapter1.SelectCommand.CommandText = cmd

            recordcount = OleDbDataAdapter1.Fill(table)

            If recordcount <> 0 Then
                tbActiviteit.Text = CStr(table.Rows(0)(2))
                tbResultaat.Text = CStr(table.Rows(0)(3))
                tbToelichting.Text = CStr(table.Rows(0)(4))

            End If

        Finally
            OleDbConnection1.Close()
        End Try
    End Sub
End Class

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:46
Jamaar, wat lukt er dan nu niet ?
Nu komt het op me over dat je wil dat anderen de code hier voor jou debuggen, en dat is niet echt gewenst.

Je kan zelf je code debuggen dmv een breakpoint te plaatsen, en dan stap voor stap je code uitvoeren.
(En kijk ook eens naar parametrized queries)

https://fgheysels.github.io/


Verwijderd

Waarom staat er een _ aan het einde van die regel?

@Whoami: Je had inderdaad gelijk, maar de TS had niets gezegd over de hoeveelheid gegevens, ik gokte maar dat het er niet veel waren :).
TAKENFUNC.TAKEN_NAAM
Moet dat niet
code:
1
Functies.TAKEN_NAAM

zijn?

[ Voor 22% gewijzigd door Verwijderd op 21-12-2005 10:25 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:46
Verwijderd schreef op woensdag 21 december 2005 @ 10:24:
Waarom staat er een _ aan het einde van die regel?
Omdat dat moet in vb.net geloof ik, als je een string over meerdere regels splitst.

Misschien kunnen we zowiezo best ff wachten totdat de TS met meer info op de proppen komt, maar die fout in de query zou het wel idd eens kunnen zijn aangezien die tabel nergens geselecteerd wordt.

[ Voor 14% gewijzigd door whoami op 21-12-2005 10:29 ]

https://fgheysels.github.io/


  • Lilacrazor
  • Registratie: Juni 2001
  • Laatst online: 23-12-2025
Verwijderd schreef op woensdag 21 december 2005 @ 10:24:
Waarom staat er een _ aan het einde van die regel?

@Whoami: Je had inderdaad gelijk, maar de TS had niets gezegd over de hoeveelheid gegevens, ik gokte maar dat het er niet veel waren :).


[...]

Moet dat niet
code:
1
Functies.TAKEN_NAAM

zijn?
Het zijn niet veel gegevens. Dit ben ik vergeten te vermelden. Het probleem is nu, dat wanneer ik in de listbox een functie selecteer ik een error krijg. Indien ik de qeury simpel maak dus SELECT * FROM TAKENCLUSTER dan werkt het wel. De _ aan het einde van de regel (om de code overzichtelijker te maken) heb ik weggehaald. Hoe het zou moeten werken:

Je clickt op een functie (aanwezig in tabel functie). Hij checkt welk FUNC_NAAM er bij hoort. Vervolgens kijkt hij in de koppeltabel TAKENFUNC welke TAKEN_NAAM gekoppelt is aan de FUNC_NAAM en vervolgens moet hij de gegevens ACTIVITEIT, RESULTAAT, TOELICHTING ophalen die bij de betreffende TAKEN_NAAM horen.

Een screenshot van de qeurybuilder in VB.NET wanneer ik de Data-adapter toevoeg. Hier krijg ik al een SELECT error, zie plaatje hieronder (volgens mij projectgenoten niet belangrijk want hij "runt" het programma wel).

Afbeeldingslocatie: http://tinypic.com/ixdufk.jpg

Afbeeldingslocatie: http://tinypic.com/ixduo2.jpg

[ Voor 13% gewijzigd door Lilacrazor op 21-12-2005 10:40 ]


Verwijderd

Lilacrazor schreef op woensdag 21 december 2005 @ 10:34:
[...]


Het zijn niet veel gegevens. Dit ben ik vergeten te vermelden. Het probleem is nu, dat wanneer ik in de listbox een functie selecteer ik een error krijg. Indien ik de qeury simpel maak dus SELECT * FROM TAKENCLUSTER dan werkt het wel. De _ aan het einde van de regel (om de code overzichtelijker te maken) heb ik weggehaald. Hoe het zou moeten werken:

Je clickt op een functie (aanwezig in tabel functie). Hij checkt welk FUNC_NAAM er bij hoort. Vervolgens kijkt hij in de koppeltabel TAKENFUNC welke TAKEN_NAAM gekoppelt is aan de FUNC_NAAM en vervolgens moet hij de gegevens ACTIVITEIT, RESULTAAT, TOELICHTING ophalen die bij de betreffende TAKEN_NAAM horen.
Goed, maar dan moet je die tabel TAKENFUNC wel in je FROM-clausule zetten...

Ook wel handig als je vertelt wat voor error je krijgt.

  • Lilacrazor
  • Registratie: Juni 2001
  • Laatst online: 23-12-2025
Verwijderd schreef op woensdag 21 december 2005 @ 10:38:
[...]

Goed, maar dan moet je die tabel TAKENFUNC wel in je FROM-clausule zetten...

Ook wel handig als je vertelt wat voor error je krijgt.
De error die ik krijg:

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in system.data.dll

Verwijderd

Lilacrazor schreef op woensdag 21 december 2005 @ 10:40:
[...]


De error die ik krijg:

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in system.data.dll
Waarschijnlijk omdat je in je WHERE-clause een tabel gebruikt die niet in de FROM-clause staat....?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:46
Mja, sorry hoor maar dit is toch gewoon een gevalletje 'debug m'n code'.
Die OleDbException duidt erop dat je met een fout in je SQL query zit, dus kijk daar eens naar.
Probeer de query die je hebt eens direct uit te voeren in access, en kijk wat access zegt.
Daar zit de fout gewoon.
En als die data-adapter een fout geeft, dan moet je dat niet negeren, want dat duidt er ook al op dat er iets niet zal werken.

[ Voor 19% gewijzigd door whoami op 21-12-2005 10:43 ]

https://fgheysels.github.io/

Pagina: 1