【问题标题】:Referencing an entire data set instead of a single Cell引用整个数据集而不是单个单元格
【发布时间】:2015-01-08 11:10:16
【问题描述】:

我正在创建一个登录表单,供用户使用数据库登录。我想知道是否有一种方法可以让程序搜索整个表格而不是某个项目。到目前为止,这是我的代码。

Dim UserInputtedUsername As String
    Dim UserInputtedPassword As String

    UserInputtedUsername = txtAdminUsername.Text
    UserInputtedPassword = txtAdminPassword.Text

    sqlrunnerQuery = "SELECT * FROM tblLogin"
    daRunners = New OleDb.OleDbDataAdapter(sqlrunnerQuery, RunnerConnection)
    daRunners.Fill(dsRunner, "Login")
    If UserInputtedUsername = dsadminlogin.Tables("Login").Rows(0).Item(2) And UserInputtedPassword = dsadminlogin.Tables("Login").Rows(0).Item(3) Then
        Form1.Show()
    ElseIf MsgBox("You have entered incorrect details") Then
    End If
End Sub

【问题讨论】:

  • 更改 SQL 查询以使用 WHERE 子句。如果它与名称广告密码匹配(顺便说一句,应该散列),你只会得到一行。
  • 请不要以纯文本形式存储密码。了解如何对它们进行哈希处理和加盐。

标签: vb.net


【解决方案1】:

相反,如果为您的用户搜索(内存中的)DataSet,则首先搜索数据库。因此,您必须在 sql 查询中使用WHERE(带有猜测的列名):

sqlrunnerQuery = "SELECT * FROM tblLogin WHERE UserName=@UserName AND PassWord=@PassWord"

请注意,我使用 sql 参数来防止 sql 注入。您可以这样添加它们:

daRunners = New OleDb.OleDbDataAdapter(sqlrunnerQuery, RunnerConnection)
daRunners.SelectCommand.Parameters.AddWithValue("@UserName", txtAdminUsername.Text)
daRunners.SelectCommand.Parameters.AddWithValue("@PassWord", txtAdminPassword.Text)

如果没有这样的用户,现在表是空的。

If dsadminlogin.Tables("Login").Rows.Count = 0  Then
    MsgBox("You have entered incorrect details")
End If

为了完整起见,您可以使用DataTable.Select 搜索完整的DataTable。但我更喜欢LINQ-To-DataSet。这是一个简单的例子:

Dim grishamBooks = From bookRow in tblBooks
                   Where bookRow.Field(Of String)("Author") = "John Grisham"
Dim weHaveGrisham = grishamBooks.Any()

【讨论】:

  • 列名是 UserUsername 和 UserPassword。如果是这种情况,我将如何解决
  • @JoelHumphreys:使用数据库或DataTable 方法(效率较低)?我已经展示了sql方式,如果要过滤DataSet/DataTable:Dim user=From row In dsadminlogin.Tables("Login") Where row.Field(Of String)("UserUsername")=txtAdminUsername.Text AndAlso row.Field(Of String)("UserPassword")=txtAdminPassword.Text
  • 嗨蒂姆。我已按照上述所有步骤操作,但它向我提供了一个错误,即在线所需参数中没有值,daRunners.Fill(dsRunner, "Login") 有什么想法吗?这是针对 SQL 方式的。
  • @JoelHumphreys:你看到我编辑了我的评论了吗?您使用的是什么数据库?传递参数的方式不同。在 SQL-Server 和大多数其他服务器中,您需要使用上述语法(“@UserName”)。你用过daRunners.SelectCommand.Parameters.AddWithValue(或Parameters.Add)吗?
  • 是的,我使用过 daRunners.SelectCommand.Parameters.AddWithValue 我正在通过访问数据库运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 2015-07-08
  • 1970-01-01
  • 2010-09-22
  • 2020-08-07
  • 1970-01-01
相关资源
最近更新 更多