28. december 2004 - 00:25Der 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 :-/
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
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?
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? :-)
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]
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?
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
strSQL = "SELECT Brugernavn FROM Info WHERE Brugernavn = '" & txtBrugernavn.Text & "'" objComm = New OleDbCommand(strSQL, objConn) objDataReader = objComm.ExecuteReader() If objDataReader.Read Then ... Else ... End If
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
Okay, det er fint! Du skal have mange tak for hjælpen denne gang! Jeg kan helt sikkert bruge det :-)
Synes godt om
Ny brugerNybegynder
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.