我正在开发一个我自己登录的应用程序。我创建一个用户,然后调用该函数返回给我一个用户。当我这样做时,我可以单步执行代码,我可以看到我正在重新定义用户对象但是当我返回该函数时它是空的。有任何想法吗?代码调用下面列出的函数和函数。感谢
Public Function LoginUser(ByVal displayname As String, ByVal pw As String) As User
Dim con As SqlConnection = Nothing
Dim cmd As SqlCommand = Nothing
Dim dtr As SqlDataReader
Dim strSQL As String = String.Empty
Dim loggedinUser As New User()
con = New SqlConnection()
con.ConnectionString = ConfigurationManager.ConnectionStrings("wlsConnectionString").ConnectionString
strSQL = "Select * from Users where displayname = @displayname and pw = @pw"
cmd = New SqlCommand(strSQL, con)
cmd.Parameters.AddWithValue("@pw", pw)
cmd.Parameters.AddWithValue("@Displayname", displayname)
con.Open()
'con.Open()
dtr = cmd.ExecuteReader()
If dtr.Read() Then
loggedinUser.UserID = 1
loggedinUser.active = dtr("active")
loggedinUser.Role = dtr("role_id")
loggedinUser.Displayname = dtr("displayname")
loggedinUser.created = dtr("created")
Else
End If
Return loggedinUser
End Function
AttemptedUser.Displayname = UserName.Text
AttemptedUser.pw = Password.Text
AttemptedUser.LoginUser(UserName.Text, Password.Text)
If AttemptedUser.UserID <> Nothing Then
Session("userid") = AttemptedUser.UserID
Session("role") = AttemptedUser.Role
Session("Displayname") = AttemptedUser.Displayname
End If
答案 0 :(得分:1)
你没有对返回值做任何事情:
AttemptedUser.LoginUser(UserName.Text, Password.Text)
您运行该方法,但忽略它返回的User
对象。您需要将该对象放在变量中:
Dim someUser As User = AttemptedUser.LoginUser(UserName.Text, Password.Text)
您的对象/方法结构似乎也有点脱节。请注意,您在对象上设置值:
AttemptedUser.Displayname = UserName.Text
AttemptedUser.pw = Password.Text
然后将这些相同的值传递给已经拥有它们的同一个对象:
AttemptedUser.LoginUser(UserName.Text, Password.Text)
并返回一个完全不同的对象:
Dim loggedinUser As New User()
'...
Return loggedinUser
有很多不同的方法可以解决这个问题,但我想在LoginUser
对象上创建一个Shared
工厂方法会更有意义。
旁注:我不禁注意到您以纯文本格式存储用户密码。请从不那样做。用户密码应该经过哈希处理,永远不应该是可读的。有关该主题的更多阅读,请查看here。