Avatar billede suppenudel Nybegynder
28. december 2004 - 00:25 Der er 17 kommentarer og
1 løsning

Tjekke om brugernavn findes i forvejen

Hej, jeg ved godt den har været oppe før, men jeg kunne ikke løse den vha de tidligere tråde.

Jeg skal tjekke om brugernavnet i access-databasen findes i forvejen. Jeg har hertil skrevet noget i stil med dette:


Sub Tjek_brugernavn()
Dim strSQL as string

strSQL = "SELECT Info.Brugernavn FROM Info;"
       
objComm = New OleDbCommand(strSQL, objConn)
objDataReader = objComm.ExecuteReader()

Do While objDataReader.Read = true
If txtBrugernavn.text =objDataReader("Info.Brugernavn")Then
lbl_fejl_beskrivelse.text = "Brugernavnet eksisterer allerede!"
              Exit Sub
              End If
          Loop
          objDataReader.Close()
End Sub

Men der sker ikke rigtig noget - ikke engang en fejlmeddelelse
:-/
Avatar billede johnstigers Seniormester
28. december 2004 - 00:28 #1
http://www.eksperten.dk/point.phtml?navn=suppenudel - der sker heller ikke rigtigt noget når du opretter spørgsmål, hva?

Hvad med at ACCEPTERE div. svar eller bare få dem lukket?

Du har 29 åbne spørgsmål ud af 38....

(tror ikke folk vil hjælpe, når de ser de ikke får point...)
Avatar billede suppenudel Nybegynder
28. december 2004 - 00:37 #2
Der er mange der ikke engang lægger et svar! Men er i gang med at lukke. Førhen vidste jeg ikke hvordan man lukkede.

Har du en løsning på mit problem?
Avatar billede arne_v Ekspert
28. december 2004 - 08:08 #3
Prøv evt.:

strSQL = "SELECT Brugernavn FROM Info;"

og

If txtBrugernavn.text =objDataReader("Brugernavn")Then
Avatar billede johnstigers Seniormester
28. december 2004 - 10:35 #4
suppenudel> du har et navn der er nemt at huske - derfor VIDSTE jeg du havde mange åbne spørgsmål - kun derfor kommenterede jeg :)

P.s. min tone var lidt hård, det beklager jeg. Men kanon du har lukket dine spørgsmål ;)
Avatar billede suppenudel Nybegynder
28. december 2004 - 23:05 #5
arne v: Jeg prøvede din ændring, med der sker stadig det samme, altså den fortsætter videre uden nogen fejlmeddelelse.

Hvis jeg tester den i Access finder den alle brugernavne, så det kan da ikke være der problemet er, men hvorfor brokker den sig så ikke når brugernavnet er det samme som det fundne?
Avatar billede arne_v Ekspert
28. december 2004 - 23:10 #6
Kan du ikke prøve at udskrive

"|" & txtBrugernavn.text & "|"
"|" & objDataReader("Info.Brugernavn") & "|"

for hvert gennemløb og checke for:
  - forskelle store små bogstaver
  - eventuelle mellemrums tegn
Avatar billede suppenudel Nybegynder
29. december 2004 - 01:29 #7
Ok fint! Jeg har fået det til at virke så langt. - Altså hvis nu brugeren ER i databaseb i forvejen. Ellers retunerer den en DBNULL som den ikke er glad for. Jeg har søgt lidt herinde og fundet ud af at jeg kan bruge:

If objDataReader("Brugernavn") is DBNull.Value Then

Det har jeg så lagt ind i koden så den ser således ud:

          Dim strSQL as string
          objConn.Open()
          strSQL = "SELECT Brugernavn FROM Info;"

          objComm = New OleDbCommand(strSQL, objConn)
          objDataReader = objComm.ExecuteReader()

          Do While objDataReader.Read = true

              If objDataReader("Brugernavn") is DBNull.Value Then
                       
              response.write("Det er et DBnull")

              Else If txtBrugernavn.text = objDataReader("Brugernavn") Then
              lbl_fejl_beskrivelse.text = "Brugernavnet eksisterer!"             
              Exit Sub             
            End If
          Loop

Jeg kører dette, skriver den så "Det er et DBnull" x antal gange efter hinanden, altså alle de gange den løber gennem brugerne i DB'en.

Jeg ville egentlig bare gerne have at den hoppede ud af løkken og gik videre hvis brugernavnet vare frit. Altså noget lignende et "End Do While" måske? Det er måske simpelt nok? :-)
Avatar billede arne_v Ekspert
29. december 2004 - 08:55 #8
Jeg forstår ikke hvorfor du har NULL i Brugernavn feltet - det giver ikke mening.

Jeg kan heller ikke se hvorfor du skla løbe igennem alle rækker.

strSQL = "SELECT Brugernavn FROM Info WHERE Brugernavn = '" & txtBrugernavn.Text & "'"
objComm = New OleDbCommand(strSQL, objConn)
objDataReader = objComm.ExecuteReader()
If objDataReader.Read Then
  ...
Else
  ...
End If

burde være nok.

[bortset fra at du bør bruge parameters for at undgå SQL injection men lad os
vente lidt med det]
Avatar billede suppenudel Nybegynder
29. december 2004 - 22:23 #9
Nej du har egentlig ret, der er da slet ingen grund til den løkke!
Jeg prøver lige at ændre det til det du har foreslået :-)

Angående SQL Injection, så har jeg læst lidt om det rundt omkring. Og har også fundet ud af at jeg f.eks. snildt kan omgå mine logins med ' OR ''=''
Men hvordan bruger jeg de parameters?
Avatar billede arne_v Ekspert
29. december 2004 - 22:25 #10
Prøv og studer det her eksempel:

Imports System
Imports System.IO
Imports System.Data
Imports System.Data.OleDb

Class MainClass

    Public Shared Sub Main(ByVal args As String())
        Dim con As OleDbConnection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=")
        con.Open
        Dim cre As OleDbCommand = New OleDbCommand ("CREATE TABLE imgtest (id INTEGER PRIMARY KEY,img OLEObject)", con)
        cre.ExecuteNonQuery
        Dim imgfile As Stream = New FileStream ("C:\blue.jpg", FileMode.Open)
        Dim siz As Integer = imgfile.Length
        Dim imgdata(siz-1) As Byte
        imgfile.Read(imgdata, 0, imgdata.Length)
        imgfile.Close
        Dim ins As OleDbCommand = New OleDbCommand ("INSERT INTO imgtest VALUES(@id,@img)", con)
        ins.Parameters.Add("@id", OleDbType.Integer)
        ins.Parameters.Add("@img", OleDbType.VarBinary)
        ins.Parameters("@id").Value = 1
        ins.Parameters("@img").Value = imgdata
        ins.ExecuteNonQuery
        Dim sel As OleDbCommand = New OleDbCommand ("SELECT img FROM imgtest WHERE id = @id", con)
        sel.Parameters.Add("@id", OleDbType.Integer)
        sel.Parameters("@id").Value = 1
        Dim imgdata2 As Byte() = CType(sel.ExecuteScalar, Byte())
        Dim drp As OleDbCommand = New OleDbCommand ("DROP TABLE imgtest", con)
        drp.ExecuteNonQuery
        Dim imgfile2 As Stream = New FileStream ("C:\blue2.jpg", FileMode.Create)
        imgfile2.Write(imgdata2, 0, imgdata2.Length)
        imgfile2.Close
        con.Close
    End Sub
End Class
Avatar billede arne_v Ekspert
29. december 2004 - 22:26 #11
Det er en console app og ikke en web app, men det er ligegyldigt for parametre.
Avatar billede arne_v Ekspert
01. januar 2005 - 12:44 #12
OK ?
Avatar billede suppenudel Nybegynder
01. januar 2005 - 23:44 #13
hej, jeg har ikke lige haft tid til at kigge på det pga nytåret. Jeg kigger på det i morgen, men du får selvfølgelig los points :-)
Avatar billede suppenudel Nybegynder
05. januar 2005 - 01:40 #14
Okay, men jeg forstår bare ikke helt ud af dit eksempel, hvor jeg kan sætte de parametre ind. Altså hvordan kan jeg bruge:

  sel.Parameters.Add("@id", OleDbType.Integer)
  sel.Parameters("@id").Value = 1


I mit eksempel:


strSQL = "SELECT Brugernavn FROM Info WHERE Brugernavn = '" & txtBrugernavn.Text & "'"
objComm = New OleDbCommand(strSQL, objConn)
objDataReader = objComm.ExecuteReader()
If objDataReader.Read Then
  ...
Else
  ...
End If
Avatar billede arne_v Ekspert
05. januar 2005 - 08:12 #15
Prøv:

strSQL = "SELECT Brugernavn FROM Info WHERE Brugernavn = @bruger"
objComm = New OleDbCommand(strSQL, objConn)
objComm.Parameters.Add("@bruger", OleDbType.VarChar)
objComm.Parameters("@bruger").Value = txtBrugernavn.Text
objDataReader = objComm.ExecuteReader()
Avatar billede suppenudel Nybegynder
05. januar 2005 - 15:18 #16
Jeps! Det kan jeg godt få til at virke. Men jeg er stadig ikke helt 100% med på hvordan - altså hvad det er de gør?

Jeg smider lige nogle ekstra point oven i hatten! :-)
Avatar billede arne_v Ekspert
05. januar 2005 - 15:21 #17
strSQL = "SELECT Brugernavn FROM Info WHERE Brugernavn = @bruger"  ' query med parameter
objComm = New OleDbCommand(strSQL, objConn) ' opret command med query
objComm.Parameters.Add("@bruger", OleDbType.VarChar) ' fortæl command at der er en parameter og angiv navn og data type
objComm.Parameters("@bruger").Value = txtBrugernavn.Text ' angiv værdi
objDataReader = objComm.ExecuteReader() ' udfør
Avatar billede suppenudel Nybegynder
05. januar 2005 - 15:28 #18
Okay, det er fint! Du skal have mange tak for hjælpen denne gang! Jeg kan helt sikkert bruge det :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester