Springen naar inhoud


- - - - -
VS 2015

Variabele Als Waarde Doorgenven

VS2015

  • Log in a.u.b. om te beantwoorden
Er zijn 2 reacties in dit onderwerp

#1 Zwozwedra

Zwozwedra

    Starting Developer

  • Leden
  • 10 berichten
    Laatst bezocht 13 mei 2021 09:24

Geplaatst op 16 februari 2021 - 10:40

Halo, bollebozen.

Ik ben maar beginneling en zit met een, voor mij, onoplosbaar probleem:

Hierbij een gedeelte van de code:
Visual Basic Code:
Private Sub lsbTabel_Click(sender As Object, e As EventArgs) Handles lsbTabel.Click
		txbSqlString.Text = ""

		' bepalen welke naam dient gezocht te worden, die wordt opgeslagen in strMijnKeuze

		' enkel ter controle of de juiste gegevens worden ingelezen
		Dim strMijnKeuze As String

		strMijnKeuze = lsbTabel.SelectedItem
		txbMijnKeuze.Text = strMijnKeuze

		'zoeken van de naam in de datareader en de lijn inlezen
		'Dim drMijnRij As DataRow

		'openen van de connectie

		conn.Open()

		'zoeken van de rij
		'opbouwen sqlcommand
		Dim sqlMijnRij As String =
		"SELECT " _
		& "L_nr, L_naam, L_Adres, L_Postnr, L_gemeente " _
		& "FROM " _
		& "tblLeerling " _
		& "WHERE " _
		& "L_Naam = strMijnKeuze"

		txbSqlString.Text = sqlMijnRij

		' bepalen OledbCommand
		Dim cmdMijnRij As New OleDbCommand(sqlMijnRij, conn)
		'
		' bepalen reader
		Dim drMijnKeuze As OleDbDataReader
		drMijnKeuze = cmdMijnRij.ExecuteReader

		'sluiten van de connectie
		'conn.Close()

		' Initialiseren van de listbox
		lsbTabel.Text = ""

		'Uitlezen van de gegevens
		Do While drMijnKeuze.Read		'zolang het einde van de datareader niet bereikt is de gegevens wegschrijven.  
			' Als de datareader op het einde komt wordt er een False (-1) doorgegeven.
			lsbTabel.Items.Add(drMijnKeuze("L_Naam"))
		Loop
		conn.Close()
	End Sub



Ik krijg telkens een foutmelding:
System.Data.OleDb.OleDbException: 'Waarden voor een of meer vereiste parameters ontbreken.'

Ondertussen weet ik dat de fout veroorzaakt wordt bij het doorgeven in de WHERE-clausule, waar het de bedoeling is dat de waarde van strMijnKeuze wordt doorgegeven.  Ik heb het geprobeerd met "L_Naam = @strMijnKeuze", en op allerelii andere manieren, maar geen oplossing.  Bij doorgeven van "L_Naam = 'strMijnKeuze'" wordt natuurlijk gezocht op de waarde 'strMijnKeuze', maar niet op de inhoud.  Kan iemand mij verder helpen?

Alvast bedankt,

Zwozwedra

#2 Supervos

Supervos

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1423 berichten
    Laatst bezocht gisteren, 06:03
  • LocatieBrugge

Geplaatst op 17 februari 2021 - 17:39

Dag Zwozwedra,

Je hebt 2 mogelijkheden, een goede en een slechte, ik ga eerst met de goede beginnen:
Je kan je variabele doorgeven naar je database als ee nparameter, dit is je optie waar je "L_Naam = @strMijnKeuze" gebruikt, je moet dan enkel nog aan je database laten weten wat de waarde van die variabele @strMijnKeuze is, dit maak je bekend aan je Command:
Code:
cmdMijnRij.Parameters.AddWithValue("@strMijnKeuze", strMijnKeuze)


Een andere mogelijkeid, maar die wordt ten strengste afgeraden, is dat je je sql string correct aanmaakt:
Code:
"L_Naam = '" & strMijnKeuze & "'"


Het is misschien moeilijk leesbaar voor tussen de = en de & staat er single quote gevolgd door een dubbele quote. De single quote is om in SQL het begin van een string aan te geven, de dubbele quote is om aan Visual Basic duidelijk te maken dat dit het einde van je string is. Dan plak je de waarde van strMijnKeuze en je sluit af door een single quote tussen dubbele quotes, dit is om aan SQL duidelijk te maken dat je string daar eindigt.

De reden waarom dit wordt afgeraden is voor de beroemde/beruchte SQL injections. Dit betekend dat je van buitenaf je query kan aanpassen zodat hij andere dingen uitvoert dan verwacht. Stel dat je strMijnKeuze een single quote bevat, dan zal SQL niet zien dat het de bedoeling is dat dit nog altijd deel uitmaakt van je waarde, intern zien dat dat het einde is van je waarde waarmee je L_Naam wilt vergelijken en de rest als onderdeel van query behandelen. In het ene geval zorgt dit er voor dat je in je database geen namen met een single quote kan bevatten (of je zal een Exception krijgen) en in het andere geval kan iemand die kwaad van wil is nog andere queries uitvoeren. Stel dat iemand volgende naam ingeeft:
Code:
strMijnKeuze = "Tom'; drop table tblLeerling; --"

Dan zal de database dit zien als 2 verschillende opdrachten, de eerste opdracht is om een leerling met de naam Tom op te zoeken, de andere opdracht is om de tabel tblLeerling te verwijderen. Het laatste deel, de dubbele mintekens is een veelgebruikte manier om aan te geven dat alles wat volgt als commentaar moet worden gezien. Zo zal de single quote die op het einde erbij wordt geplakt (en eventueel andere filters) worden genegeerd en krijg je geen foutmelding hierover.

Als je de eerste manier van werken volgt, en die naam als een parameter doorgeeft, dan zal de database weten dat die single quote deel uitmaakt van die variabele en letterlijk naar die waarde zoeken (en zo de Sql Injection vermijden).

Hopelijk helpt dit :)

#3 Zwozwedra

Zwozwedra

    Starting Developer

  • Leden
  • 10 berichten
    Laatst bezocht 13 mei 2021 09:24

Geplaatst op 17 februari 2021 - 18:13

Guru,

Bedankt, de eerste oplossing werkt feilloos.  Allen zou ik het nooit gevonden hebben.

zwozwedra





Ook met taq VS 2015, VS2015 voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[VS 2015] Untitled 1

Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)