需要帮助从 VB.Net 中的 While 循环中提取变量

Need help extracting variables from a While Loop in VB.Net

我是编码新手,所以如果我的问题看起来很基础,请原谅我,但我在从这个 While 循环中提取我的变量以便使用我的 SQL 查询的结果时遇到了一些问题用于验证。

下面的脚本是 .aspx 表单上登录按钮的事件处理,处理将列在相关 MSSQL 数据库中的电子邮件和登录字段:

Public Class _Default
Inherits System.Web.UI.Page
Protected Sub submit_Click(sender As Object, e As EventArgs) Handles submit.Click
    Dim Column1 As String
    Dim Column2 As String
    Dim SQL = "SELECT * FROM Logins WHERE Email='" & email.Text & "' AND Password='" & password.Text & "'"
    Dim oSqlDataReader As System.Data.SqlClient.SqlDataReader = Nothing
    Using oSqlConnection As New System.Data.SqlClient.SqlConnection("SERVER=[Server Name];UID=[User];PWD=[Pass];DATABASE=[Database Name]")
        oSqlConnection.Open()
        Using oSqlCommand As New System.Data.SqlClient.SqlCommand(SQL, oSqlConnection)
            oSqlDataReader = oSqlCommand.ExecuteReader
            While oSqlDataReader.Read
                Column1 = oSqlDataReader(name:="Email")
                Column2 = oSqlDataReader(name:="Password")
            End While
        End Using
        oSqlConnection.Close()
    End Using        
    If "Column 1 etc."
    End if
End Sub
End Class

据我所知,我的代码没有任何错误,但每次我尝试创建 If 语句时,我的变量 Column 1 and Column 2 都未声明,因此无法使用。

如果有人可以帮助我的代码或遗漏区域进行正确的布局,并解释我哪里出错了,那就太好了。

如果在循环内移动 If 块,是否会更接近您期望的行为?

Protected Sub submit_Click(sender As Object, e As EventArgs) Handles submit.Click
    Dim Column1 As String
    Dim Column2 As String
    Dim SQL = "SELECT * FROM Logins WHERE Email='" & email.Text & "' AND Password='" & password.Text & "'"

    Dim oSqlDataReader As System.Data.SqlClient.SqlDataReader = Nothing

    Using oSqlConnection As New System.Data.SqlClient.SqlConnection("SERVER=[Server Name];UID=[User];PWD=[Pass];DATABASE=[Database Name]")
        oSqlConnection.Open()

        Using oSqlCommand As New System.Data.SqlClient.SqlCommand(SQL, oSqlConnection)
            oSqlDataReader = oSqlCommand.ExecuteReader

            While oSqlDataReader.Read
                Column1 = oSqlDataReader(name:="Email")
                Column2 = oSqlDataReader(name:="Password")

                If "Column 1 etc....."
                End if
            End While
        End Using

        oSqlConnection.Close()
    End Using
End Sub

可能是您的查询没有返回任何行,或者返回的值为 dbNull 或什么都没有。如果合适,我会检查返回的数据和错误。

尝试运行 直接对数据库进行查询。你回来了吗?

为避免错误,您可以将字符串声明为 String.empty

Dim Column1 As String = String.empty

或者,在 if 语句中使用它时不检查任何内容:

If Column1 Is Not Nothing AndAlso ...

不要使用字符串连接来构建您的 sql 查询。而是使用 sql 参数来防止 sql 注入和其他问题。

我必须承认我不知道这个语法:oSqlDataReader(name:="Email")。使用以下内容:

Dim email As String
Dim password As String
Dim sql = "SELECT * FROM Logins WHERE Email=@Email AND Password=@Password"

Using oSqlConnection As New System.Data.SqlClient.SqlConnection("SERVER=[Server Name];UID=[User];PWD=[Pass];DATABASE=[Database Name]")
    Using oSqlCommand As New System.Data.SqlClient.SqlCommand(sql, oSqlConnection)
        oSqlCommand.Parameters.Add("@Email", SqlDbType.VarChar).Value = email.Text
        oSqlCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = password.Text
        oSqlConnection.Open()
        Using oSqlDataReader = oSqlCommand.ExecuteReader()
            If oSqlDataReader.Read() Then
                Dim emailColIndex = oSqlDataReader.GetOrdinal("Email")
                Dim pwdColIndex = oSqlDataReader.GetOrdinal("Password")
                email = oSqlDataReader.GetString(emailColIndex)
                password = oSqlDataReader.GetString(pwdColIndex)
            End If
        End Using
    End Using
End Using ' oSqlConnection.Close() not needed with using '

If email IsNot Nothing AndAlso password IsNot Nothing Then

End If

但是,您不应初始化两个字符串变量,而应实现可以初始化的 Login class 和 return 方法。您不想知道电子​​邮件和密码,因为您已经有了它们。

由于这是 ASP.NET,我建议查看可用的 membership provider,它们功能强大且具有学习曲线,但绝对值得花时间。