Toon posts:

Login maken met VB.NET Dataset

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste mensen,

Ik ben al een tijdje bezig om een login systeem te maken met VB.NET. Dit is me tot op heden niet gelukt. Ik gebruik datasets om tabellen enzovoorts weer te geven.
Zo ver ben ik gekomen:

Dim username As String = ""
username = TextBox4.Text


If (DB_<databasenaam>DataSet.LOGIN.USERNAMEColumn.ColumnName) = username Then
MsgBox("OKE")

Else

MsgBox("FOUT")
End If


Het bovenstaande is niet goed omdat (DB_<databasenaam>DataSet.LOGIN.USERNAMEColumn.ColumnName) "USERNAME" heeft!

Iemand die mijn kan helpen?

Alvast bedankt!

Completa

Verwijderd

probeer je wel je eigen code te snappen? Wat denk je dat ColumnName teruggeeft?

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 17-12 15:40
Ik ken de taal niet, maar zou proberen:

Visual Basic:
1
if (DB_<databasenaam>DataSet.LOGIN.USERNAMEColumn.Value) = username Then

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:12
Als ik het goed begrijp, is jouw probleem dat er in je DB 'USERNAME' staat, en dat jij 'username' ingeeft ?
Je wil dus case insensitive vergelijken ?
Kijk eens naar :

String.Compare() method
of naar de
StringComparer class, die bv een static property CurrentCultureIgnoreCase heeft, die een case-insensitive string-comparer returned.

Afgezien daarvan, denk ik niet dat het een goed idee is om op deze manier een login-control te maken. (Alle usernames uit de DB trekken, en lokaal in het geheugen houden).
IMHO is het beter om een query te doen, die gewoon checkt of je een record in je DB hebt dat matcht met de gegeven credentials.

[ Voor 30% gewijzigd door whoami op 05-05-2009 10:13 ]

https://fgheysels.github.io/


  • BM
  • Registratie: September 2001
  • Laatst online: 20:49

BM

Moderator Spielerij
Zijn probleem is op dit moment dat ie aan de dataset vraagt wat de naam van de kolom is (hence, ColumnName) en niet wat er in die kolom staat.

Iets als dit zou moeten werken:
Visual Basic .NET:
1
2
3
4
if (DB_<databasenaam>DataSet.LOGIN.Select('USERNAMEColumn = <hier_je_username').Length >0)
MessageBox.Show("Ok")
else
MessaegBox.Show("Ophoepelen")


Wat whoami verder zegt over het valideren bij de database ipv een lokale dataset is wel gewoon natuurlijk :)

[ Voor 13% gewijzigd door BM op 05-05-2009 10:22 ]

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Verwijderd

Topicstarter
@Boeboe: Dat had ik dus al door. iig tnx voor je reactie:D
@BlackHawkDesign: Zoiets dacht ik dus ook. Maar helaas is "Value" geen onderdeel van System.data.datacolumn. Tnx voor je reactie
@whoami: Dank je!
@BM: Bedankt! Dit "werkt" wel alleen krijg ik de melding dat de kolomnaam niet bestaat! Maar dat ga ik nu even uitzoeken!

Nogmaals bedankt allen!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je in het vervolg code post, lees dan even dit door: Hoe post je code? / Hoe gebruik je de code tag?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Opgelost dankzij BM!
Oplossing:

code:
1
2
3
4
5
6
 If (DB_<databasenaam>DataSet.LOGIN.Select("Username like '" + username + "' ").Length > 0) Then
            MessageBox.Show("Ok")
        Else
            MessageBox.Show("Ophoepelen")

        End If


Bedankt!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:12
Waarom doe je een LIKE als je toch geen LIKE-functionaliteit gebruikt ?

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
En het is een beetje vreemd dat je eerst een complete dataset ophaalt en daarna daarin alsnog een select gaan doen. Waarom doe je dan niet een select op de database zelf?

Verder denk ik als ik deze code zie meteen aan deze strip: http://xkcd.com/327/ ( SqlInjection )
Aangezien je de bewerking op een DataSet doet zal het gevolg waarschijnlijk niet zo erg zijn, maar wel iets om op te letten.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
whoami schreef op dinsdag 05 mei 2009 @ 12:16:
Waarom doe je een LIKE als je toch geen LIKE-functionaliteit gebruikt ?
Je hebt gelijk. Ik gebruik het '=' teken ipv 'like'

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:12
Woy heeft ook gelijk; waarom doe je -zoals ik eerder al zei- niet gewoon rechtstreeks een SQL statement op de DB ?
Wat is het nut om al die usernames uit de DB te trekken, om dan gewoon nog eens in memory te gaan checken of er een record is met die specifieke username ?
Waarom doe je dat niet rechtstreeks op de DB ?

Zowiezo lijkt me dat niet echt veilig om al die gegevens uit de DB te gaan trekken; alles passeert over de lijn, dus het is te sniffen.
Waarom niet gewoon checken of de DB een record bevat voor de gegeven credentials ?
Gewoon een query ala
code:
1
select count(*) from users where username = @username and password = @pwd

uitvoeren dus, en checken of je 1 of 0 terugkrijgt. (En ook pwd encrypten liefst)

https://fgheysels.github.io/


Verwijderd

Topicstarter
@Whoami en de rest

Bedankt voor jullie kritische reacties.
Ik zal hier morgen mee verder gaan. Waarom ik bepaalde keuzes niet maak? Omdat ik nog geen held ben in programmeren! Vandaar! Ik probeer daarom ook mijn best te doen zal dan ook iets doen met jullie commentaar!

Verwijderd

Topicstarter
Zoals beloofd zou ik hetgeen wat ik hier boven heb staan, anders doen. Dit heb ik ook gedaan. Namelijk op de volgende manier:

code:
1
myCommand = New SqlCommand("Select username, password from  Login where username= '" + naam + "' and userpassword= '" + password + "' ", myConnection)


:)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je bent nu alleen nog gevoelig voor SQL injection en dat wil je zéker niet ;)
Je gebruikt al netjes een SqlCommand; als je nu nog even kijkt naar Over het gebruik van Parametrized Queries ben je er ;)

[ Voor 18% gewijzigd door RobIII op 06-05-2009 11:05 ]

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:12
Al beter, maar nog steeds kwetsbaar voor sql injection attacks ...

Kijk eens naar parametrized queries.
Maak een SqlCommand waarbij je parameter-placeholders in je query schrijft, ipv de waardes dmv string concatenation in je string te gaan plakken.
Kijk dan eens naar de Parameters collection van het SqlCommand over hoe je waardes kunt toekennen aan de parameter placeholders. :)

edit:
door mod-af te zijn, verlies je blijkbaar ook de post-snelheid

[ Voor 8% gewijzigd door whoami op 06-05-2009 11:06 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Gentelmen....

Ik heb jullie advies opgevolgd en dit is hoe een INSERT query er nu uitziet:

code:
1
sqlCommando.CommandText = "INSERT INTO LOGIN (username) VALUES (@userName)"


Ik krijg helaas voor geen meter de waarden in de database met de variablen vergeleken!
Dit is wat ik nu heb:
code:
1
2
3
4
5
6
7
 Try
            sqlCommando.CommandText = "Select usernamefrom LOGIN where username= (@Username)"
            sqlCommando.Parameters.AddWithValue("Username", "Hans")            
            sqlCommando.ExecuteNonQuery()
        Catch ex As Exception
            MsgBox("Error")
        End Try


Alleen werkt het bovenstaande niet :(
Edit: Ik wil dus database waarden en variablen met elkaar vergelijken(Login, zie ook topic onderwerp)
Edit2: Bij het debuggen komt het programma niet bij:
code:
1
sqlCommando.ExecuteNonQuery()

[ Voor 12% gewijzigd door Verwijderd op 06-05-2009 15:37 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 06 mei 2009 @ 15:27:
Alleen werkt het bovenstaande niet :(
Wat werkt er niet :? We hebben immers geen glazen bol.

Gaat het niet verkeerd door de Case-Sensitive vergelijking?
Ik mis overigens ook nog een spatie in de code die je plaatst.
En er hoeven geen haakjes om @Username bij je select

[ Voor 31% gewijzigd door Woy op 06-05-2009 15:33 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Arethusa
  • Registratie: December 2003
  • Laatst online: 19-12 10:45

Arethusa

Niet die server

Als je een breakpoint op regel 5 in je voorbeeld zet moet je de fout kunnen achterhalen.

[ Voor 17% gewijzigd door Arethusa op 06-05-2009 15:36 ]

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:12
Wordt er een exception gegooid ?
Zoja, welke ?
(Kan je nu natuurlijk moeilijk weten, aangezien je wel exceptions opvangt, maar je print gewoon 'error'. Zorg er eens voor dat je te weten komt welke foutmelding je exact krijgt).

Aangezien je zegt dat ExecuteNonQuery niet uitgevoerd wordt, zal er dus een exception gegooid worden bij het toevoegen van je parameter.
Er zal geen parameter userName bestaan; er bestaat echter wel een parameter @userName.

[ Voor 33% gewijzigd door whoami op 06-05-2009 15:42 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Dit is de error die ik krijg:
Eigenschap Connection is niet geinitialiseerd: regel86(sqlCommando.ExecuteNonQuery())

opgelost met:
code:
1
            sqlCommando.Connection = dbConnection


mijn try werkt nog steeds niet!

[ Voor 33% gewijzigd door Verwijderd op 06-05-2009 15:59 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dan moet je bij je SqlCommand aangeven welke connection hij moet gebruiken.
Het lijkt me sterk dat je Try niet werkt. Je bedoelt dat er wat anders niet werkt, maar net zoals eerst kunnen we natuurlijk niet raden wat er niet werkt.

[ Voor 66% gewijzigd door Woy op 06-05-2009 16:16 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Probleem is opgelost en heb het login systeem werkend. Bedankt voor jullie input!
Edit: Nu met code:

code:
1
2
3
4
5
6
7
Dim sqlCommando As New SqlCommand("SELECT username, userpassword FROM login WHERE username = @username  and userpassword = @fuserpassword ", con)
        sqlCommando.Parameters.Add(New SqlParameter("@username", SqlDbType.VarChar, 20)).Value = ""
        sqlCommando.Parameters.Add(New SqlParameter("@userpassword", SqlDbType.VarChar, 20)).Value = ""


        sqlCommando.Parameters("@username").Value = username
        sqlCommando.Parameters("@userpassword").Value = password

[ Voor 76% gewijzigd door Verwijderd op 06-05-2009 16:47 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je dan ook nog even post wat de oplossing voor jou was, dan heeft iemand anders er later misschien nog wat aan.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
2 dingen:
* Ik zie in je query nu userpassword = @fuserpassword en je parameter heet @userpassword ;)
* Je doet nu .Value = "" en daarna zet je de values (2x). Dat kan natuurlijk ook in 1 keer ;)

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

Pagina: 1