簡體   English   中英

將字符串變量與SQL表VB.Net比較

[英]Comparing String Variable to SQL table VB.Net

因此,到現在為止,我大概對數據庫編程和一般的SQL經驗都很少,所以如果我所說的超出了我的理解范圍,我深表歉意。 我一直在嘗試創建一個登錄表單來訪問我的數據庫表,並比較用戶已寫入表本身的內容。 在不懈地搜索互聯網之后,我似乎無法理解為什么我編寫的代碼無法讀取表格。 這是一個例子,也許有人可以幫助我了解我的問題?

Public Function CompareDbValues(Compare_1 As String)
    Using connection As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\User\OneDrive\Software\WindowsApplication1\WindowsApplication1\Database1.mdf;Integrated Security=True")
        connection.Open()

        Dim sSQL As String = "SELECT UserName, Password FROM [Table] WHERE UserName = 'Me.UserName.Text' AND Password = 'Me.Password.Text'"
        Using Command As New SqlCommand(sSQL, connection)
            Dim Reader As SqlDataReader
            Reader = Command.ExecuteReader()

            If Reader.HasRows Then
                Do While Reader.Read()
                    If Compare_1 = Reader("UserName").ToString Then

                        Return True

                    Else

                        Return False

                    End If
                Loop
            End If


        End Using


        connection.Close()
    End Using

    Return False

End Function

我的問題似乎是我的代碼到達“ If Reader.HasRows Then”行時。 再次感謝您的關注。

首先,將您的sql像這樣發送到數據庫:

SELECT UserName, Password 
FROM [Table] 
WHERE UserName = 'Me.UserName.Text' AND Password = 'Me.Password.Text'

由於我沒有假設用戶將選擇Me.UserName.Text作為用戶名和Me.Password.Text作為密碼,我想沒有人會通過此登錄。

其次,如果您想通過將文本框文本連接到sql字符串來解決此問題,請再考慮一下。 這是主要的安全隱患。 了解有關Sql注入攻擊的信息。

正確的方法是使用參數化查詢或存儲過程。

Dim sSQL As String = "SELECT 1 " & _
                     "FROM [Table] " & _
                     "WHERE UserName = @UserName " & _
                     "AND Password = @PassWord " & _
                     "AND @UserName = @Compare"
    Using Command As New SqlCommand(sSQL, connection)
        Command.Parameters.Add("@UserName", SqlDbType.VarChar).Value = Me.UserName.Text
        Command.Parameters.Add("@Password", SqlDbType.VarChar).Value = Me.Password.Text
        Command.Parameters.Add("@Compare", SqlDbType.VarChar).Value = Compare1
        Dim Reader As SqlDataReader = Command.ExecuteReader()
        Return Reader.HasRows
    End Using

請注意,where子句已經為您比較了值,因此您所要做的只是查看查詢是否返回了任何行。

這是您的問題在這里:

Dim sSQL As String = "SELECT UserName, Password FROM [Table] WHERE UserName = 'Me.UserName.Text' AND Password = 'Me.Password.Text'"

您要告訴數據庫將數據庫中的值與文字文本“ Me.UserName.Text”和“ Me.Password.Text”進行比較。 您實際上從哪里都看不到用戶輸入的文本並將其發送到數據庫。 請注意,在您發布的代碼中,這些部分是如何變成紅色的? 這意味着它們是文字String一部分。 如果您使用變量,那么它們不會是紅色的。 這實際上是您想要做的:

Dim sSQL As String = "SELECT UserName, Password FROM [Table] WHERE UserName = '" & Me.UserName.Text & "' AND Password = '" & Me.Password.Text & "'"

現在使用變量並從變量中獲取數據,並將該數據連接到文字String

雖然那仍然不是很好的代碼。 我不在這里討論它,因為它超出了您原始問題的范圍,但是您應該學習如何使用參數化查詢,這可以保護您免受各種問題的影響,最重要的是可以防止SQL注入攻擊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM