webForumDet fria alternativet

db koppling

.NET

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 →
Medlem sedan mars 20023 561 inlägg
#21

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. ;)

Medlem sedan jan. 2002227 inlägg
#22

redigerat förra inlägg! hur uppdaterar jag där det är fet markerad?

Medlem sedan apr. 2004778 inlägg
#23

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
Medlem sedan jan. 2002227 inlägg
#24

kan du visa lite kod hur man gör med stored procedure?
hur anropar jag en stored procedure?

Medlem sedan mars 20023 561 inlägg
#25
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... ;)

Medlem sedan apr. 2004778 inlägg
#26

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.

Medlem sedan mars 20023 561 inlägg
#27

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
Medlem sedan jan. 2002227 inlägg
#28

tackar!

Medlem sedan jan. 2002227 inlägg
#29

ä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
Medlem sedan jan. 2002227 inlägg
#30

men jag får 0 värde på retuneringen? även om jag loggar in korrekt

Medlem sedan apr. 2004778 inlägg
#31

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?

Medlem sedan jan. 2002227 inlägg
#32

din funkar! måste man ha select med för att räkna rows?

Medlem sedan apr. 2004778 inlägg
#33

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.

Medlem sedan jan. 2002227 inlägg
Medlem sedan jan. 2002227 inlägg
#35

eller nej din kod funkar ju inte :s

Medlem sedan apr. 2004778 inlägg
#36

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
Medlem sedan jan. 2002227 inlägg
#37

funkar fortfarande inte :s retunerar bara 0

Medlem sedan apr. 2004778 inlägg
#38

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.

Medlem sedan jan. 2002227 inlägg
#39

jepp de sätts till 1 när man loggar in korrekt

Medlem sedan apr. 2004778 inlägg
#40

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
258 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)