Men du har ju ändrat i sql-strängen. Från "SELECT COUNT " till "SELECT ID", det gör ju att du kommer att få tillbaka id:t på den personen som stämmer överrens med användarnamnet. Det lär inte bli 1 så ofta. ;)
db koppling
58 svar · 1 365 visningar · startad av pellesvenne · sida 2 av 3
Frågan, av pellesvenne
hejsan jag har precis börjat med asp.net! jag undrar om det är bra att inkluderar en db koppling med asp.net? vilket är det bästa sättet? ska man lägga db kopplingen i web.config eller global.asax eller nån annanstans?
Läs frågan i sin helhet →redigerat förra inlägg! hur uppdaterar jag där det är fet markerad?
Då får du köra ett nytt databasanrop.
Om du kör SQL Server rekommenderar jag att du kollar på Stored Procedures och lägger loginkollen i en procedur. Då kan du göra updateringen direkt i SPn istället för att anropa databasen två gånger.
Men här är i alla fall din kod uppdaterad.
Private Sub loggain_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles loggain.Click
Dim dbConnection As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("connection"))
Dim queryString As String = "SELECT Count(ID) from medlemmar WHERE anvandarnamn=@anvandarnamn AND losenord=@losenord"
Dim dbCommand As SqlCommand = New SqlCommand(queryString, dbConnection)
dbCommand.Parameters.Add("@anvandarnamn", SqlDbType.NVarChar, 15).Value = anvandarnamn.Text
dbCommand.Parameters.Add("@losenord", SqlDbType.NVarChar, 15).Value = losenord.Text
dbConnection.Open()
Dim num As Integer = dbCommand.ExecuteScalar()
dbConnection.Close()
If num = 1 Then
Dim queryString As String = "UPDATE medlemmar SET Online = 1 WHERE anvandarnamn=@anvandarnamn AND losenord=@losenord"
Dim dbCommand As SqlCommand = New SqlCommand(queryString, dbConnection)
dbCommand.Parameters.Add("@anvandarnamn", SqlDbType.NVarChar, 15).Value = anvandarnamn.Text
dbCommand.Parameters.Add("@losenord", SqlDbType.NVarChar, 15).Value = losenord.Text
dbConnection.Open()
dbCommand.ExecuteScalar()
dbConnection.Close()
Session("anvandarnamn") = anvandarnamn.Text
'login.Text = "Rätt"
Else
'login.Text = "Fel"
End If
End Sub
kan du visa lite kod hur man gör med stored procedure?
hur anropar jag en stored procedure?
Dim objConn As New SqlConnection()
Dim objCmd As New SqlCommand("[i]<namnet på sp:n>[/i]", objConn)
objCmd.CommandType = CommandType.StoredProcedure
objCmd.Parameters.Add(<[i]här lägger du till ev. parametrar[/i]>)
objCmd.Connection.Open()
Dim i As Integer = objCmd.ExecuteNonQuery()
objCmd.Connection.Close()
objCmd.Dispose()
objConn.Dispose()
I korta drag... ;)
Nu var du snabb Josef. Satt och skrev på mitt svar när det plingade till i mailboxen att någon annan hade svarat.
Det jag kan tillägga är en liten SP jag använder för att logga in. Har gjort ett par ändringar så att de passar ditt behov men du får själv byta namn på tabeller och dylikt.
CREATE Procedure CheckLogin
(
@anvandarnamn varchar(15),
@losenord varchar(15)
)
As
Declare @UserID int
SELECT @UserID = ID
FROM medlemmar
WHERE anvandarnamn=@anvandarnamn
AND losenord=@losenord
if @@ROWCOUNT = 1
begin
UPDATE medlemmar
SET Online = 1
WHERE ID = @UserID
end
else
begin
SET @UserID = 0
end
return @UserID
Denna returnerar användarens ID om det funkar annars returnerar den 0.
Men om du nu ska använda det så här och sätt Online variabeln till 1 så måste du göra en SP till som sätter Online till 0 när man loggar ut och sedan anropa den t.ex. i Session End i global.asax.
Ja, det var jag. ;)
För att använda Patriks sp:
Dim objConn As New SqlConnection(ConfigurationSettings.AppSettings("connectionstring"))
Dim objCmd As New SqlCommand("CheckLogin", objConn)
objCmd.CommandType = CommandType.StoredProcedure
objCmd.Parameters.Add("@anvandarnamn", SqlDbType.NVarChar, 15).Value = anvandarnamn.Text
objCmd.Parameters.Add("@losenord", SqlDbType.NVarChar, 15).Value = losenord.Text
objCmd.Connection.Open()
Dim UserID As Integer = objCmd.ExecuteScalar()
objCmd.Connection.Close()
If UserID = 0 Then
'Misslyckad inloggning
Else
'Lyckad inloggning.
End If
tackar!
är det inte bättre och göra så här?
CREATE Procedure checkLogin
@anvandarnamn varchar(15),
@losenord varchar(15)
As
Declare @UserID int
UPDATE medlemmar SET Online = 1 WHERE anvandarnamn = @anvandarnamn and losenord = @losenord
if @@ROWCOUNT = 1
begin
SET @UserID = 1
end
else
begin
SET @UserID = 0
end
return @UserID
GO
men jag får 0 värde på retuneringen? även om jag loggar in korrekt
Om du har gjort den som du skrev så är det inte konstigt att du får 0. Du gör ju ingen SELECT.
Får du 0 även om du använder min?
din funkar! måste man ha select med för att räkna rows?
Ja, annars får du ju inga rows att räkna. Det är SELECTen som kollar om loginuppgifterna stämmer.
En SELECT hämtar saker, en UPDATE uppdaterar bara.
eller nej din kod funkar ju inte :s
Ok, det stämmer visst att det räcker med UPDATE för att kolla om det är rätt Login. Däremot så måste du ändå ha en SELECT för att få fram ID numret.
Om inte min fungerade ändra till detta.
CREATE Procedure checkLogin
@anvandarnamn varchar(15),
@losenord varchar(15)
As
Declare @UserID int
UPDATE medlemmar SET Online = 1 WHERE anvandarnamn = @anvandarnamn and losenord = @losenord
if @@ROWCOUNT = 1
begin
SELECT @UserID= ID
FROM medlemmar
WHERE anvandarnamn = @anvandarnamn
and losenord = @losenord
end
else
begin
SET @UserID = 0
end
return @UserID
GO
funkar fortfarande inte :s retunerar bara 0
Har du kollat i tabellen om Online sätts till 1? Om den inte gör det så har det inte skett nån inloggning och rows är 0, då returnerar den 0.
Prova att köra proceduren direkt i databasen för att se vad som händer, alltså inte genom koden.
jepp de sätts till 1 när man loggar in korrekt
Du kan ju alltid prova att vända på Rowcount funktionen och se vad som händer.
if @@ROWCOUNT = 0
begin
SET @UserID = 0
end
else
begin
SELECT @UserID= ID
FROM medlemmar
WHERE anvandarnamn = @anvandarnamn
and losenord = @losenord
end
