Springen naar inhoud


- - - - -
VS 2015

Drukknop Met Variabele Value In Access Database

VS2015

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

#1 Johnster

Johnster

    Starting Developer

  • Leden
  • 8 berichten
    Laatst bezocht 22 jul 2020 11:45
  • LocatieLeuven

Geplaatst op 01 juli 2020 - 17:11

Mijn naam is John en ben nieuw hier. Ik ben een leek in het programmeren en zoek alles op via google en youtube. Tot nu toe lukte dit heel goed maar ik ben voor iemand die ik ken een kassasysteem aan het maken voor zijn kapsalon. Heb al gezien dat ik niet de enige ben met een kassa :-o.

Mijn vraag naar jullie toe is hoe ik aan mijn code moet beginnen? Ik heb een access database file met 3 kolommen (ID,Naam, Prijzen). In mijn kassa gebruik ik een form met verschillende command buttons. Die zou ik dan koppelen aan het ID in de DB. (Button2 = ID2, Button3 = ID3 enz)
De value van kolom Naam en Prijzen moet ook in de datagridview (Datagridview1) worden weergegeven.

Volgende stap is om de button text te koppelen met de 2 de kolom (Naam) in de database en te laden bij het openen van het programma zodat als er in de DB iets wordt aangepast de naam van de knop mee wordt aangepast. Hopelijk begrijpen jullie een beetje wat ik bedoel.

Alvast bedankt voor de hulp.

Dit is wat ik al gevonden had maar werkt niet en is niet compleet

Code:
Dim con As New OleDb.OleDbConnection
Dim accessconn As New _
System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Johnster\documents\visual studio 2015\Projects\Cash register\Cash register\Database11.accdb;Jet OLEDB:Database Password=")
accessconn.Open()
Command = New System.Data.OleDb.OleDbCommand("INSERT INTO Prijzen where [ID] =2 ([Naam],[Prijs]) VALUES(@Naam, @Prijs)", accessconn)
Command.Parameters.AddWithValue("@Naam", DataGridView1.Rows.(0).Value)
Command.Parameters.AddWithValue("@Prijs", DataGridView1.Rows.(1).Value)
accessconn.Close()



#2 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 752 berichten
    Laatst bezocht 09 aug 2020 11:16
  • LocatieMechelen (BE)

Geplaatst op 01 juli 2020 - 20:11

command.execute ofzo ontbreekt nog, je zet wel alles veilig klaar maar je doet er niets mee :) ook doe je geen .dispose van je command object

trouwens je kunt ook using gebruiken in deze opzet
Visual Basic Code:
using command as System.Data.OleDb.OleDbCommand("INSERT INTO Prijzen where [ID] =2 ([Naam],[Prijs]) VALUES(@Naam, @Prijs)", accessconn)
' doe je dingen hier
end using
dan heb je geen dispose nodig ;)

ook nog een truuk: gebruik imports boven aan je form class, in jouw geval imports System.Data.OleDb dan kun je direct alles wat achter oledb staat van functies e.d. direct gebruiken ;)

Ow en oppassen met vaste directory's, beter is om het path te nemen waar de exe in bevind (Application.StartupPath) of localdatapath

#3 Johnster

Johnster

    Starting Developer

  • Leden
  • 8 berichten
    Laatst bezocht 22 jul 2020 11:45
  • LocatieLeuven

Geplaatst op 02 juli 2020 - 08:32

Ik heb het nu zo gedaan maar hoe ga ik nu verder dat het in mijn datagrid te zien is want er komt een foute waarde in?

Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Johnster\documents\visual studio 2015\Projects\Cash register\Cash register\Database11.accdb;Jet OLEDB:Database Password=")
cn.Open()

Dim conn As System.Data.OleDb.OleDbCommand
conn = New System.Data.OleDb.OleDbCommand("INSERT INTO Prijzen where [ID] =2 ([Naam],[Prijs]) VALUES(@Naam, @Prijs)")
'conn.ExecuteReader(CommandBehavior.CloseConnection)
cn.Close()
Dim sData As String = ""
Dim sDatas As String = ""
sData = conn.Parameters.AddWithValue("@Naam", OleDbType.VarChar).Value
sDatas = conn.Parameters.AddWithValue("@Prijs", OleDbType.VarChar).Value
Me.DataGridView1.Rows.Add(sData, sDatas)

End Using

#4 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 752 berichten
    Laatst bezocht 09 aug 2020 11:16
  • LocatieMechelen (BE)

Geplaatst op 02 juli 2020 - 17:22

Wat je nu doet is een insert, dus je duwt/schrijft je data naar de db, als je wilt lezen doe je een select.

Visual Basic Code:
Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Johnster\documents\visual studio 2015\Projects\Cash register\Cash register\Database11.accdb;Jet OLEDB:Database Password=")
cn.Open()

using cmd As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand("INSERT INTO Prijzen where [ID] =2 ([Naam],[Prijs]) VALUES(@Naam, @Prijs)")
cmd.Parameters.AddWithValue("@Naam", OleDbType.VarChar)
cmd.Parameters.AddWithValue("@Prijs", OleDbType.VarChar)
cmd.ExecuteReader()'CommandBehavior.CloseConnection

cmd.oledbcommand="Select * from Prijzen Order by Naam ASC"
dim data = cmd.ExecuteReader(CommandBehavior.CloseConnection)
DataGridView1.Rows.Add(data)
End Using


ik denk dat je zoiets nodig hebt, misschien je datagridview in een nieuwe sub zetten en dan die sub aanroepen.

Ow dit is gewoon zo uit de losse pols getypt, kan zijn dat ik heir en daar wat naast zit :)

#5 Johnster

Johnster

    Starting Developer

  • Leden
  • 8 berichten
    Laatst bezocht 22 jul 2020 11:45
  • LocatieLeuven

Geplaatst op 03 juli 2020 - 09:59

Damic,

Alvast bedankt voor de hulp.

cmd.oledbcommand="Select * from Prijzen Order by Naam ASC" gaf fout " oledbcommand is not a member of oledbcommand"
Dit verandert naar cmd.commandtext maar weet niet of je dat bedoelde.

Nu geeft het een "syntax error insert into statement" foutmelding

Dit is de code tot nu toe

Code:
	 Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Johnster\documents\visual studio 2015\Projects\Cash register\Cash register\Database11.accdb;Jet OLEDB:Database Password=")
		 cn.Open()
		 Using cmd As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand("INSERT INTO Prijzen where [ID] =2 ([Naam], [Prijs]) VALUES(@Naam, @Prijs)", cn)
			 cmd.Parameters.AddWithValue("@Naam", OleDbType.VarChar)
			 cmd.Parameters.AddWithValue("@Prijs", OleDbType.VarChar)
			 cmd.ExecuteReader()
			 'CommandBehavior.CloseConnection
			 cmd.CommandText = "Select * from Prijzen Order by Naam ASC"
			 Dim data = cmd.ExecuteReader()
			 'CommandBehavior.CloseConnection
			 DataGridView1.Rows.Add(data)
		 End Using
	 End Using


Zie niet meteen wat het kan zijn

#6 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 752 berichten
    Laatst bezocht 09 aug 2020 11:16
  • LocatieMechelen (BE)

Geplaatst op 06 juli 2020 - 18:26

  • cmd.Parameters.AddWithValue("@Naam", OleDbType.VarChar)
  • cmd.Parameters.AddWithValue("@Prijs", OleDbType.VarChar)
die oledbtype.varchar zou een waarde moeten zijn, in dit geval Procut naam en een prijs ow en prijs nooit als varchar doen maar als double (vroeger was er nog currency ofzoiets), mmmh zien nu dat er wat verkeerd is gegaan onderweg, eerst had je DataGridView1.Rows.(0).Value en dan heb je dat naar varchar gezet. Nu welke waarde moet er in de db tabel komen of staat deze er al in?

#7 Johnster

Johnster

    Starting Developer

  • Leden
  • 8 berichten
    Laatst bezocht 22 jul 2020 11:45
  • LocatieLeuven

Geplaatst op 06 juli 2020 - 18:39

De waarde die in mijn Database bij ID2 staan moeten in de datagrid komen te staan. Dit is kolom Naam en Prijs. Alvast bedankt om het eens te bekijken.

#8 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 752 berichten
    Laatst bezocht 09 aug 2020 11:16
  • LocatieMechelen (BE)

Geplaatst op 06 juli 2020 - 18:49

Ha dan is het vermoedelijk:
Visual Basic Code:
	 Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Johnster\documents\visual studio 2015\Projects\Cash register\Cash register\Database11.accdb;Jet OLEDB:Database Password=")
		 cn.Open()
		 Using cmd As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand("Select * from Prijzen Order by Naam ASC", cn)
			 dim data  = cmd.ExecuteReader()
			 DataGridView1.Rows.Add(data)
		 End Using
	 End Using


#9 Johnster

Johnster

    Starting Developer

  • Leden
  • 8 berichten
    Laatst bezocht 22 jul 2020 11:45
  • LocatieLeuven

Geplaatst op 06 juli 2020 - 18:52

Maar wat wordt dit dan bij ID3 wanneer ik op button3 druk?

#10 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 752 berichten
    Laatst bezocht 09 aug 2020 11:16
  • LocatieMechelen (BE)

Geplaatst op 06 juli 2020 - 19:17

Ow wacht je sql word dan "Select * from Prijzen WHERE ID=2"

Er staan dan Selecteer * (=alles) van tabel prijzen waar id=2

#11 Johnster

Johnster

    Starting Developer

  • Leden
  • 8 berichten
    Laatst bezocht 22 jul 2020 11:45
  • LocatieLeuven

Geplaatst op 06 juli 2020 - 19:42

Ok top, ga dit morgen eens proberen en ik laat iets weten als het gelukt is

#12 Johnster

Johnster

    Starting Developer

  • Leden
  • 8 berichten
    Laatst bezocht 22 jul 2020 11:45
  • LocatieLeuven

Geplaatst op 07 juli 2020 - 09:37

Dit krijg ik als value in de datagrid. https://ibb.co/XsCB4Ps

#13 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 752 berichten
    Laatst bezocht 09 aug 2020 11:16
  • LocatieMechelen (BE)

Geplaatst op 07 juli 2020 - 20:39

Daar maak ik niet veel van, je mist nog een stuk
in de plaats van DataGridView1.Rows.Add(data)  probeer eens het volgende
Visual Basic Code:
if data.row.count>0 then DataGridView1.Rows.Add({data.row(0).item("Naam"), data.row(0).item("Prijs")})

Bekijk ook eens https://docs.microso...ridview-control ow en deze https://docs.microso...ridview-control

#14 Johnster

Johnster

    Starting Developer

  • Leden
  • 8 berichten
    Laatst bezocht 22 jul 2020 11:45
  • LocatieLeuven

Geplaatst op 08 juli 2020 - 10:19

Dan geeft hij de melding "row is not a member of oledbdatareader"

#15 Supervos

Supervos

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1411 berichten
    Laatst bezocht 27 jul 2020 14:55
  • LocatieBrugge

Geplaatst op 21 juli 2020 - 13:09

Een OleDbDataReader is een object waarmee je over de rijen in de database kan lopen. Zie volgend voorbeeld:

Code:
Using cn As New OleDbConnection(connectionString)
Using cmd = cn.CreateCommand()
cmd.CommandText = "Select naam, prijs from Prijzen WHERE ID=@id Order by Naam ASC"
cmd.Parameters.AddWithValue("@id", categorieId)
cn.Open()
using reader = cmd.ExecuteReader()
	 while reader.Read()
		 DataGridView1.Rows.Add({ reader.GetString(0), reader.GetDouble(1)})
	 end while
end using
End Using
End Using


in lijn 1 heb ik je connectionstring naar een variabele verplaatst. Je zou zelfs een shared functie kunnen maken dat een connectie teruggeeft, zo moet je niet overal in je code duiken als je database ergens anders staat of een nieuw wachtwoord krijgt.
Op lijn 3 heb ik de '*' in de select gewijzigd naar de kolomen dat je nodig hebt, dit wordt aangeraden als best practice, dit omdat er in de toekomst extra kolommen kunnen komen of je kan tijd verliezen als je een kolom binnen trekt die je negeert (bijvoorbeeld een beschrijving van 100 bladzijden maar je gebruikt enkel de titel, die beschrijving wordt toch van je database naar je code gestuurd).
voor lijn 4 heb ik gebruik gemaakt van een variabele categorieId, dit is een Integer met bijvoorbeeld de waarde '2' of '3', zo is deze code herbruikbaar.

Op lijn 7 zie je dat ik de functie `Read` oproep, dit kijkt of er nog een rij aanwezig is in het antwoord en gaat naar die rij, anders geeft dit `False` terug. voor een DataReader is er geen mogelijkheid om terug te keren naar een vorige rij, enkel naar de volgende rij.
Op lijn 8 staat er code dat eigenlijk verschillende dingen doet, je zou dit kunnen opsplitsen in het volgende:
Code:
Dim naam = reader.GetString(0)
Dim prijs = reader.GetDouble(1)
Dim rij as Object() = { naam , prijs }
DataGridView1.Rows.Add(rij)


een DataReader heeft verschillende methodes om waarden uit de huidige rij te halen, op basis van het type, deze verwachten allemaal een getal (ordinal), dit is eigenlijk de kolomnummer beginnend vanaf 0. Hier komt een voordeel naar boven om de kolommen in je select op te geven in plaats van een *.
Aan deze methodes zijn er wel 2 nadelen of dingen waar je op moet letten:
1. Dit verwacht dat de waarde in het juiste type staat, zal geen omvorming doen. Hiermee bedoel ik dat, als je prijs in de database een float of decimal is, dan zal de `GetDouble` een fout geven dat de waarde van een verkeerd type is;
2. Eigenlijk hieraan gekoppeld, als je waarde in de database nullable is (kan de waarde Nothing hebben) zal dit eveneens een fout geven, zelfs met `GetString` dat eigenlijk Nothing zou teruggeven. Als de kolom eventueel Nothing/Null kan zijn is het best dat je dit eerst controleert met `IsDBNull`

Na het opvragen van de naam en de prijs maak ik hiervan een array, en deze array voeg ik toe aan de datagridview.


Handige resources:
- mapping van database types naar .NET: https://docs.microso...a-type-mappings (voornamelijk voor SQL server, kan anders zijn voor Access of MySQL of andere types databases)
- Methodes die op een DataReader bestaan: https://docs.microso...areader#methods

Disclaimer: ik heb deze code uit de losse pols geschreven, het kan zijn dat er fouten in zitten en dat deze code niet wilt compileren, speel een beetje met de code en kijk waar je verder kan of op vastloopt.





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)