Sql server 验证用户名和密码列中的登录数据

Sql server 验证用户名和密码列中的登录数据,sql-server,vb.net,login,Sql Server,Vb.net,Login,我编写了以下函数来验证用户的登录数据,但到目前为止,它没有正常工作,我确信它有问题: Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles button2.Click If loginpasswordtx.Text.Length > 1 And loginpasswordtx.Text.Length > 1 And

我编写了以下函数来验证用户的登录数据,但到目前为止,它没有正常工作,我确信它有问题:

Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles button2.Click
    If loginpasswordtx.Text.Length > 1 And loginpasswordtx.Text.Length > 1 And My.Settings.SQLConnectionString.Length > 5 Then
        Try
            Dim cnn As New SqlConnection(My.Settings.SQLConnectionString)
            Dim cmd = New SqlCommand("SELECT AppUser,AppUserPass FROM OrderAppUsers WHERE AppUser=@AppUser AND AppUserPass=@AppUserPass", cnn)
            cmd.Parameters.Add(New SqlParameter("@AppUser", createuserAppUser.Text))
            cmd.Parameters.Add(New SqlParameter("@AppUserPass", MD5StringHash(loginpasswordtx.Text)))
            cnn.Open()

            Dim obj As Object = cmd.ExecuteScalar()
            If obj = Nothing Then
                MsgBox("Faild to Log in, check your log in info")
                cnn.Close()
                Return
            End If
            cnn.Close()
        Catch ex As SqlException
            MsgBox(ex.Message)
            Return
        End Try

        MsgBox("Logged in Successfully")
    End If
End Sub
我得到的只是一个
null obj
,即使表中存在user和pass

以下代码用于添加新用户

 Try
            Dim cnnstring As String = String.Format("Server={0};Database={1};Trusted_Connection=True;", createuserServerTx.Text, createuserDatabaseTx.Text)
            Dim cnn As New SqlConnection(cnnstring)
            Dim cmd As New SqlCommand("INSERT INTO OrderAppUsers VALUES (@AppUser, @AppUserPass)", cnn)
            cmd.Parameters.Add(New SqlParameter("@AppUser", createuserAppUser.Text))
            cmd.Parameters.Add(New SqlParameter("@AppUserPass", MD5StringHash(createuserpassword.Text)))
            cnn.Open()
            cmd.ExecuteNonQuery()
            cnn.Close()
            MsgBox("User Crated Successfully")
            LayoutControl1.Visibility = Windows.Visibility.Collapsed
            My.Settings.SQLConnectionString = cnnstring
            My.Settings.Save()
        Catch ex As SqlException
            MsgBox(ex.Message)
        End Try
以及生成自定义哈希的函数

 Private Function MD5StringHash(ByVal strString As String) As String
    Dim MD5 As New MD5CryptoServiceProvider
    Dim Data As Byte()
    Dim Result As Byte()
    Dim R As String = ""
    Dim Temp As String = ""

    Data = Encoding.ASCII.GetBytes(strString)
    Result = MD5.ComputeHash(Data)
    For i As Integer = 0 To Result.Length - 1
        Temp = Hex(3 * Result(i) + 1)
        If Len(Temp) = 1 Then Temp = "0" & Temp
        R += Temp
    Next
    Return R
End Function

添加参数时请尝试以下操作

cmd.Parameters.AddWithValue("@AppUser", createuserAppUser.Text)
cmd.Parameters.AddWithValue("@AppUserPass", MD5StringHash(loginpasswordtx.Text))
或者只是坚持你所做的,但与你的有所不同

cmd.Parameters.Add("@AppUser", SqlDbType.VarChar)       
cmd.Parameters("@AppUser").Value = createuserAppUser.Text
cmd.Parameters.Add("@AppUserPass", SqlDbType.VarChar)       
cmd.Parameters("@AppUserPass").Value = MD5StringHash(loginpasswordtx.Text)
顺便说一下,当使用
ExecuteScalar()
时,它只返回单个值。因此,您的查询可以写成

SELECT COUNT(*) 
FROM OrderAppUsers
WHERE AppUser=@AppUser AND AppUserPass=@AppUserPass
您可以使用
int
变量来存储其值

Dim obj As int = Cint(cmd.ExecuteScalar())
因此,可能的值是
0
或返回的记录总数

If obj = 0 Then
    MsgBox("Faild to Log in, check your log in info")
    '' other codes
End If
通过折射代码,使用
Using-Statement

Using cnn As New SqlConnection(My.Settings.SQLConnectionString)
    Using cmd = New SqlCommand("SELECT COUNT(*) FROM OrderAppUsers WHERE AppUser=@AppUser AND AppUserPass=@AppUserPass", cnn)
        cmd.Parameters.AddWithValue("@AppUser", createuserAppUser.Text)
        cmd.Parameters.AddWithValue("@AppUserPass", MD5StringHash(loginpasswordtx.Text))
        cmd.CommandType = CommandType.Text
        Try
            cnn.Open()
            Dim obj As int = Cint(cmd.ExecuteScalar())
            If obj = 0 Then
                MsgBox("Faild to Log in, check your log in info")
            Else
                 MsgBox("Logged in Successfully")
            End If
        Catch(ex As SqlException)
             MsgBox(ex.Message.ToString())
        End Try
    End Using
End Using

添加参数时请尝试以下操作

cmd.Parameters.AddWithValue("@AppUser", createuserAppUser.Text)
cmd.Parameters.AddWithValue("@AppUserPass", MD5StringHash(loginpasswordtx.Text))
或者只是坚持你所做的,但与你的有所不同

cmd.Parameters.Add("@AppUser", SqlDbType.VarChar)       
cmd.Parameters("@AppUser").Value = createuserAppUser.Text
cmd.Parameters.Add("@AppUserPass", SqlDbType.VarChar)       
cmd.Parameters("@AppUserPass").Value = MD5StringHash(loginpasswordtx.Text)
顺便说一下,当使用
ExecuteScalar()
时,它只返回单个值。因此,您的查询可以写成

SELECT COUNT(*) 
FROM OrderAppUsers
WHERE AppUser=@AppUser AND AppUserPass=@AppUserPass
您可以使用
int
变量来存储其值

Dim obj As int = Cint(cmd.ExecuteScalar())
因此,可能的值是
0
或返回的记录总数

If obj = 0 Then
    MsgBox("Faild to Log in, check your log in info")
    '' other codes
End If
通过折射代码,使用
Using-Statement

Using cnn As New SqlConnection(My.Settings.SQLConnectionString)
    Using cmd = New SqlCommand("SELECT COUNT(*) FROM OrderAppUsers WHERE AppUser=@AppUser AND AppUserPass=@AppUserPass", cnn)
        cmd.Parameters.AddWithValue("@AppUser", createuserAppUser.Text)
        cmd.Parameters.AddWithValue("@AppUserPass", MD5StringHash(loginpasswordtx.Text))
        cmd.CommandType = CommandType.Text
        Try
            cnn.Open()
            Dim obj As int = Cint(cmd.ExecuteScalar())
            If obj = 0 Then
                MsgBox("Faild to Log in, check your log in info")
            Else
                 MsgBox("Logged in Successfully")
            End If
        Catch(ex As SqlException)
             MsgBox(ex.Message.ToString())
        End Try
    End Using
End Using

我在我的本地系统中检查了你的代码,它工作正常。我的意思是,我能够验证它的返回为真,我的分析发现它的返回为假,只有当我在加密之前在密码文本上添加一个空格时,你可以签入数据库值是将空格添加到密码值中还是可以发布你的加密代码本地系统,它工作正常我的意思是我能够验证它的返回真我的分析,发现它的返回假只有当我在加密前在密码文本上添加一个空格时你能签入数据库值是在密码值中添加空格还是你能发布你的加密代码仍然是相同的问题,我不知道出了什么问题,有趣的是,只有当我创建一个新用户并尝试登录时,它才起作用。在我关闭应用程序并尝试使用它显示为“登录失败,请检查您的登录信息”的同一用户再次登录后,我在中添加了如何将用户添加到数据库的代码question@user1570048你检查过数据库了吗?插入成功了吗?@user1570048实际上我不知道你添加的参数是否有效。它应该是
cmd.Parameters.Add(“@AppUser”,SqlDbType.VarChar)
然后添加value
cmd.Parameters(“@AppUser”).value=createuserAppUser.Text
或者你可以尝试使用
cmd.Parameters.AddWithValue(@AppUser”,createuserAppUser.Text)
同样的东西,这真的很烦人,我可以看到用户添加到数据库这不是问题,一定是有登录功能的东西!将数据加载到datatable和检查工作,使用读取器也可以工作,但是为什么它使用参数不工作真的很奇怪!仍然是同样的问题,我不知道怎么回事,有趣的是,只有当我创建了一个新用户并尝试登录时,它才起作用,在我关闭应用程序并尝试使用它所说的“登录失败,请检查您的登录信息”的同一用户再次登录后,我在中添加了如何将用户添加到数据库的代码question@user1570048你检查过数据库了吗?插入成功了吗?@user1570048实际上我不知道你添加的参数是否有效。它应该是
cmd.Parameters.Add(“@AppUser”,SqlDbType.VarChar)
然后添加value
cmd.Parameters(“@AppUser”).value=createuserAppUser.Text
或者你可以尝试使用
cmd.Parameters.AddWithValue(@AppUser”,createuserAppUser.Text)
同样的东西,这真的很烦人,我可以看到用户添加到数据库这不是问题,一定是有登录功能的东西!将数据加载到datatable和检查工作,使用读取器也可以工作,但是为什么它使用参数不工作真的很奇怪!很好,我添加了一个函数来生成自定义密码哈希到问题中,你能检查它是否与此函数一起工作吗?很好,我添加了一个函数来生成自定义密码哈希到问题中,你能检查它是否与此函数一起工作吗?