【问题标题】:How to save SQL values from queries into variables?如何将查询中的 SQL 值保存到变量中?
【发布时间】:2019-06-02 18:14:04
【问题描述】:

大家好,

我最近才开始使用 ASP.NET 和 VB.NET 进行编程,所以我一直在玩弄语法和逻辑。无论如何,我有一个 SQL 查询,它根据输入的用户名获取用户的详细信息。我的问题是:因为我从数据库表中选择 *,我如何将这些值放入变量中?我想保存到变量的值是 ID、Firstname 和 Lastname。我的计划是保存当前登录的用户 ID,这样它就会显示在我的应用程序中。

这是我所拥有的:

Protected Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click
    Dim strconn As New SqlConnection

    If strconn.State = ConnectionState.Closed Then
        strconn.ConnectionString = ("Server=0.0.0.0;Database=Test;Uid=test;Pwd=test;")
    End If


    '//prompt user for blank user credentials
    If txtUsername.Text.Length = 0 Then
        Response.Write("<SCRIPT LANGUAGE=""JavaScript"">  alert('You must enter your Access Credentials.');</script>")

        'If MsgBox("You must enter your Access Credentials.", vbInformation, vbOKCancel) Then
        'End If
        txtUsername.Focus()
        Exit Sub
    End If

    Try
        strconn.Open()
        Dim sQuery As String = "SELECT * from tblUsers WHERE username = '" & txtUsername.Text & "'" &
                               " AND password = '" & txtPassword.Text & "'" &
                               " AND status ='" & "1" & "'"

        Dim datareader As SqlDataReader
        Dim adapter As New SqlDataAdapter
        Dim parameter As New SqlParameter
        Dim command As SqlCommand = New SqlCommand(sQuery, strconn)
        command.Connection = strconn
        adapter.SelectCommand = command
        datareader = command.ExecuteReader()

        If datareader.HasRows Then
            datareader.Read()
            'MsgBox("Login Successfull!     ", vbInformation, vbOKOnly)
            'Response.Redirect("http://localhost:0000/SecurityStaffDataEntry.aspx")
            Response.Redirect("http://localhost:0000/index.aspx")
            datareader.Close()
            LoginOk = True

        Else
            Response.Write("<SCRIPT LANGUAGE=""JavaScript"">  alert('Invalid Username or Password!');</script>")
            ' MsgBox("Invalid Username or Password!    ", vbInformation, vbOKOnly)
            txtUsername.Text = ""
            txtPassword.Text = ""
            txtUsername.Focus()
        End If
        datareader.Close()

    Catch ex As Exception
        'MsgBox(ex.Message)
    End Try


End Sub

【问题讨论】:

  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 - 查看Little Bobby Tables
  • 感谢 marc_s 的链接。继续讨论链接中的内容,我的 SELECT 语句会是什么样子?可能像这样:' "SELECT * from tblUsers WHERE username = '" & @txtUsername.Text & "'" &'
  • 它应该类似于:SELECT * FROM tblUsers WHERE username = @userName .....,然后您将 @userName 参数的值分别设置为 txtUsername.Text - 不是在创建 SQL 语句时直接设置
  • 对不起,我缺乏知识,但是我将如何将@Username 参数的值设置为 txtUsername.Text?
  • 感谢@marc_s 的那篇文章。我已经尝试了文章中讨论的内容,并且效果很好。而且代码看起来也很整洁

标签: asp.net vb.net visual-studio


【解决方案1】:

把它放在 reader.Read() 之后并用变量替换文本框

while (reader.Read())
{
    TextBox1.Text = reader[0].ToString();
}

你也可以使用

reader["columnname"].ToString()

【讨论】:

  • 如果检索到多条记录,则每次迭代都会覆盖文本框中的值。
  • 在任何情况下,您都不能在单个变量中输入多条记录,因此您必须更清楚地定义您真正想要做什么的要求。如果您仍然想使用单个变量而不是连接变量中的值,然后循环结束后将其传递给文本框。
  • 根据您的问题代码,您正在使用用户名和密码进行操作,因此用户名是唯一的,因此它将始终返回单个记录...所以您实际上可以使用与我的代码中相同的方法
  • 使用while循环覆盖值看起来很傻。如果您不希望有多个记录,请不要使用循环。
  • “在任何情况下,您都不能在单个变量中输入多条记录”Dim dt As DataTableDataTable 可以将所有记录保存在一个变量中。还有一个`List(Of T)`或一个Dictionary
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
相关资源
最近更新 更多