【问题标题】:Comparing String Variable to SQL table VB.Net将字符串变量与 SQL 表 VB.Net 进行比较
【发布时间】:2015-11-21 09:13:51
【问题描述】:

所以到现在为止,我可能对数据库编程和一般的 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 sql-server database vb.net visual-studio


【解决方案1】:

首先,你的 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 子句已经为您比较了值,因此您只需查看查询是否返回了任何行。

【讨论】:

  • 感谢您提请我注意,我会仔细阅读,以便完全理解您所做的事情,也感谢您解决我的查询问题
【解决方案2】:

这是你的问题:

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 注入攻击。

【讨论】:

  • 虽然答案基本相同,但为什么要显示错误的方法而不是正确的方法?
  • 嗯,这很有道理,我会立即修改并告诉你它是否有效。
  • @ZoharPeled,因为我已经回答了问题,即为什么编写的代码不起作用。这可能是一个学校作业,使用参数化查询可能会过大,并且可能被认为是错误的,因为它使用了尚未教授的材料。
  • 是的,它不是学校作业,而是个人项目,但我也可能是今年高中的最后一年,所以参数化查询目前有点超出我的能力,但我很感激无论你们俩的回答都揭露了我不知道的事情。
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 2015-08-14
  • 2018-05-01
  • 1970-01-01
  • 2014-11-08
  • 2013-01-17
相关资源
最近更新 更多