Функция входа VB. net с использованием MS Access // два типа пользователя - PullRequest
0 голосов
/ 07 марта 2020

Здравствуйте, я пытаюсь создать систему входа в систему, в которой для входа в систему будут присутствовать администратор и суперадмин. Я просто следовал некоторым учебникам над net и пробовал самостоятельно, я новичок в vb и Я просто хочу попробовать это. Однако, выполняя приведенные ниже коды, он также не входит в систему. Он всегда идет к той части catch, в которой говорится, что он не подключается к базе данных. Вот код ошибки btw

Первое исключение типа «System.Data.OleDb.OleDbException» произошло в System.Data.dll

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles LoginBtn.Click

        If userBox.Text = "" Or passwordBox.Text = "" Then
            MessageBox.Show("Username and password are blank", "Authentication Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

        Else
            Dim conn As New System.Data.OleDb.OleDbConnection()
            conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ResortReservationSystem.accdb"
            Try

                Dim sql As String = "SELECT * FROM tbl_user WHERE username='" & userBox.Text & "' AND password = '" & passwordBox.Text & "'"
                Dim sqlCom As New System.Data.OleDb.OleDbCommand(sql)

                sqlCom.Connection = conn
                conn.Open()

                Dim sqlRead As System.Data.OleDb.OleDbDataReader = sqlCom.ExecuteReader()


                If sqlRead.Item("userType") = "Admin" Then
                    MenuForm.Show()
                    Me.Hide()
                ElseIf sqlRead.Item("userType") = "SuperAdmin" Then
                    EmployeeForm.Show()
                    Me.Hide()
                Else


                    MessageBox.Show("Username and Password do not match.", "Authentication Failure", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

                    userBox.Text = ""
                    passwordBox.Text = ""


                    userBox.Focus()
                End If

            Catch ex As Exception
                MessageBox.Show("Failed to connect to Database..", "Database Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try

        End If
    End Sub

1 Ответ

2 голосов
/ 07 марта 2020

Я изменил ваш Or в первом операторе If на OrElse для короткого замыкания кода от проверки второго условия, если оно обнаруживает, что первое является Истиной.

Соединения являются драгоценными объектами и должны быть закрыты и утилизированы. Открывайте как можно позже и закрывайте как можно скорее. Блоки Using...End Using гарантируют это, даже если есть ошибка. В этом случае объект команды также включается в Using.

. Вы можете передать строку соединения непосредственно в конструктор соединения. Аналогично, передайте текст команды и соединение конструктору команды.

Я изменил оператор Select, чтобы получить только UserType, потому что это все, что используется в методе. Не извлекайте из базы данных больше информации, чем необходимо.

Научитесь использовать Parameters. Это облегчает написание оператора sql, ускоряет запрос и защищает от внедрения sql.

Поскольку мы получаем только один фрагмент данных, мы можем использовать .ExecuteScalar, который получает первый столбец первой строки набора результатов.

После того, как соединение и команда закрыты и расположены с помощью End Using, мы можем работать с данными, полученными из базы данных.

Private Sub OpCode()
    If userBox.Text = "" OrElse passwordBox.Text = "" Then
        MessageBox.Show("Username and/or password are blank", "Authentication Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Exit Sub
    End If
    Dim AdminType As String
    Using conn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ResortReservationSystem.accdb"),
            sqlComm As New OleDbCommand("SELECT UserType FROM tbl_user WHERE username= @User AND [password] = @Password", conn)
        With sqlComm.Parameters
            .Add("@User", OleDbType.VarChar, 100).Value = userBox.Text
            .Add("@Password", OleDbType.VarChar, 100).Value = passwordBox.Text
        End With
        conn.Open()
        AdminType = sqlComm.ExecuteScalar.ToString
    End Using
    If String.IsNullOrEmpty(AdminType) Then
        MessageBox.Show("Username and Password do not match.", "Authentication Failure", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        userBox.Text = ""
        passwordBox.Text = ""
        userBox.Focus()
    ElseIf AdminType = "Admin" Then
        MenuForm.Show()
        Me.Hide()
    ElseIf AdminType = "SuperAdmin" Then
        EmployeeForm.Show()
        Me.Hide()
    End If
End Sub
...