VB.Net发出调用验证函数的问题

时间:2015-11-13 23:39:14

标签: vb.net validation if-statement

我已经编写了将数据保存到数据库的代码,这段代码运行正常。但是,在验证代码时,尽管验证代码在控制台模式下工作,但我遇到了一些问题。问题是当我调用函数(在下面的代码中看到)CheckValidPassword()等时,他们似乎没有返回正确的值,当涉及到savebutton click事件中的If语句时,代码类型会跳过它并且只需通过datagridview将数据保存到数据库中。

这是代码。

Private Sub btnsave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsave.Click
    Dim ValidUserName, ValidPassword, ValidTeacherUsername As Boolean
    Dim Username, Password, TeacherUsername As String
    Username = txtStudentID.Text
    Password = txtStudentPassword.Text
    TeacherUsername = txtTeacherID.Text
    ValidUsernameCheck(ValidUserName, Username)
    ValidPasswordCheck(ValidPassword, Password)
    ValidTeacherUsernameCheck(ValidTeacherUsername, TeacherUsername)
    If ValidUsernameCheck(ValidUserName, Username) <> True Or ValidPasswordCheck(ValidPassword, Password) <> True Or ValidTeacherUsernameCheck(ValidTeacherUsername, TeacherUsername) <> True Then
        MsgBox("Saving failed", MsgBoxStyle.OkOnly)
        'Exit Sub
    Else
        Try
            Dim dataAdapter As New OleDbDataAdapter
            Dim DataTable As New DataTable
            Dim DataSet As New DataSet
            Connection.Open() ' the following decleration are used to save content to the table.     
            DataSet.Tables.Add(DataTable)
            Dim SQLQuery As String = (<sql>SELECT * FROM Students</sql>)
            dataAdapter = New OleDbDataAdapter(SQLQuery, Connection)
            dataAdapter.Fill(DataTable)
            Dim newRow As DataRow = DataTable.NewRow
            With newRow ' the with statement allows you do repeatedly apply a property to a certain object
                .Item("StudentID") = txtStudentID.Text ' these statements add the content of the text boxes to these respective fields in the database
                .Item("TeacherID") = txtTeacherID.Text
                .Item("StudentFirstName") = txtStudentFirstname.Text
                .Item("StudentSurname") = txtStudentSurname.Text
                .Item("StudentPassword") = txtStudentPassword.Text
                .Item("StudentGroup") = cbxStudentGroup.Text
            End With
            DataTable.Rows.Add(newRow)
            Dim Command As New OleDbCommandBuilder(dataAdapter)
            dataAdapter.Update(DataTable) 'updates the table
            Connection.Close()
            ShowItems() ' displays the table
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Connection.Close()
        End Try
    End If
End Sub

以下是用于验证三个关键数据位的三个函数。

Function ValidUsernameCheck(ByRef ValidUserName As Boolean, ByVal Username As String) As Boolean
    Dim Valid1, Valid2 As Boolean
    If Char.IsLetter(Mid(Username, 1, 3)) Then ' takes the first 3 characters of a user name to see if they are 
        ' letters
        Valid1 = True
    Else
        Valid1 = False
    End If

    If Char.IsNumber(Mid(Username, 4, 8)) Then 'does the same with numbers, starting at char(4) and taking 8.
        Valid2 = True
    Else
        Valid2 = False
    End If
    If Valid1 = True And Valid2 = True Then
        ValidUsernameCheck = True
    Else
        ValidUsernameCheck = False
    End If
    Return ValidUsernameCheck
End Function

Function ValidTeacherUsernameCheck(ByRef ValidTeacherUsername As Boolean, ByVal TeacherUsername As String) As Boolean
    Dim Valid1, Valid2 As Boolean
    If Char.IsLetter(Mid(TeacherUsername, 1, 3)) Then ' takes the first 3 characters of a user name to see if they are 
        ' letters
        Valid1 = True
    Else
        Valid1 = False
    End If

    If Char.IsNumber(Mid(TeacherUsername, 4, 8)) Then 'does the same with numbers, starting at char(4) and taking 8.
        Valid2 = True
    Else
        Valid2 = False
    End If
    If Valid1 = True And Valid2 = True Then
        ValidTeacherUsernameCheck = True
    Else
        ValidTeacherUsernameCheck = False
    End If
    Return ValidTeacherUsernameCheck
End Function

Function ValidPasswordCheck(ByRef ValidPassword As Boolean, ByVal Password As String) As Boolean
    If System.Text.RegularExpressions.Regex.Match(Password, "\d").Success Then
        ValidPasswordCheck = True
    Else
        ValidPasswordCheck = False
    End If
    Return ValidPasswordCheck
End Function

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的代码似乎有点过于复杂。您可以随时使用Return语句从函数返回 - 只要检测到输入值不正确,就可以Return False,因为通常不需要进行任何进一步的验证检查。

看起来你至少熟悉一些正则表达式,所以你可以用一个来检查用户名和密码。

代码似乎是为学生设置凭据,因此让用户知道哪个条目存在问题(如果有)是没有害处的。此外,最好告诉用户该条目应采用何种格式。

您正在检查ID,而不是名称 - 您应该正确命名这些功能。

因此,您的代码可能如下所示:

Private Function IsIdFormatCorrect(ID As String) As Boolean
    If String.IsNullOrEmpty(ID) OrElse ID.Length <> 11 Then
        Return False
    End If

    ' require name to be exactly (three letters followed by eight digits)
    Return Regex.IsMatch(ID, "^[A-Za-z]{3}[0-9]{8}$")

End Function

Private Function IsPasswordFormatCorrect(password As String) As Boolean
    If String.IsNullOrEmpty(password) Then
        Return False
    End If

    ' require password to be only digits and at least four of them
    Return Regex.IsMatch(password, "^[0-9]{4,}$")

End Function

Private Sub bnSave_Click(sender As Object, e As EventArgs) Handles bnSave.Click
    Dim errorText As String = ""
    If Not IsIdFormatCorrect(txtStudentID.Text) Then
        errorText = "Student ID not in correct format (""ABC12345678"")." & vbCrLf
    End If
    If Not IsIdFormatCorrect(txtTeacherID.Text) Then
        errorText &= "Teacher ID not in correct format (""ABC12345678"")." & vbCrLf
    End If
    If Not IsPasswordFormatCorrect(txtStudentPassword.Text) Then
        errorText &= "Student password not in correct format (at least four digits)."
    End If

    If errorText.Length > 0 Then
        MessageBox.Show(errorText, "Data entry problem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    Else
        ' save to database
    End If

End Sub