vb. net // Не удалось подключиться к базе данных? Система входа Проверьте пользователя, если администратор или нет - PullRequest
0 голосов
/ 03 марта 2020

Привет, ребята, я внедряю систему входа в систему, в которой есть два пользователя: администратор или суперадмин, однако всегда не удается подключиться к базе данных. Я немного новичок в VB. net, и я пытаюсь выяснить, как это работает, и да, я искал в Интернете, как создать, но это не удается, и, кстати, вот журнал ошибок, сгенерированный после регистрации в

Не удалось подключиться к базе данных

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

Imports System.Data.OleDb
Imports System.Data
Public Class LoginFrm

    Private Sub LoginBtn_Click_1(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"

            Dim sql As String = "SELECT * FROM userTable WHERE userName='" & userBox.Text & "' AND passWord = '" & passwordBox.Text & "'"
            Dim sqlCom As New System.Data.OleDb.OleDbCommand(sql)
            sqlCom.Connection = conn
            sqlCom.Connection.Open()
            Dim sqlRead As System.Data.OleDb.OleDbDataReader = sqlCom.ExecuteReader()
            If sqlRead.Item("userType") = "SuperAdmin" Then
                welcomeFrm.Show()
                Me.Hide()
            End If
            If sqlRead.Item("userType") = "Admin" Then
                manageEmployeeForm.Show()
            Else
                MessageBox.Show("Username and Password do not match.", "Authentication Failure", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                userBox.Text = ""
                passwordBox.Text = ""
                userBox.Focus()
            End If
        End If
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Close()
    End Sub
End Class

Редактировать: я исправил некоторые проблемы, и теперь я сталкиваюсь с этим, нет никаких данных для строки / столбца. Насколько я знаю, .Item для получения данных, но, похоже, это не работает для меня. имя таблицы: поля userTable: userName, passWord, userType данные: Джон, Доу, SuperAdmin

Ответы [ 2 ]

0 голосов
/ 04 марта 2020
  1. If userBox.Text = "" Or passwordBox.Text = "" Then Измените Or на OrElse для короткого замыкания If.

  2. Соединения и команды должны быть замкнуты и удалены. Блок Using...End Using сделает это за вас, даже если возникнет ошибка.

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

  4. Никогда не объединяйте строки с пользовательским вводом для построения sql операторов. Вы рискуете sql инъекцией, которая может испортить вашу базу данных. Это также облегчает написание оператора sql, поскольку вам не нужно использовать все эти одинарные и двойные кавычки и амперсанды.

  5. Вы используете только один фрагмент данных, поэтому не возвращайте все поля. Вам нужен только userType.

  6. Всегда используйте параметры. Access (OleDb) не заботится о названии параметра. Я просто использую соответствующие имена для удобства чтения. Важно то, что порядок появления параметра в операторе sql должен соответствовать порядку добавления параметра в коллекцию параметров. Я должен был угадать тип данных и размер поля параметров. Проверьте в вашей базе данных действительные значения и исправьте соответствующий код.

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

  8. End Using закрывает и удаляет соединение и команду, поэтому теперь мы можем связываться с возвращенными данными.

Sidenote: Ваша проблема заключалась в том, что читатель не начинает читать возвращенные строки, пока вы не вызовете reader. Это больше не актуально, так как мы не используем ридер.

Private Sub LoginBtn_Click_1(sender As Object, e As EventArgs) Handles LoginBtn.Click
    Dim AdminType As String
    If userBox.Text = "" OrElse passwordBox.Text = "" Then
        MessageBox.Show("Username and password must be filled in.", "Authentication Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Else
        Using conn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ResortReservationSystem.accdb"),
                sqlCom As New OleDbCommand("SELECT userType FROM userTable WHERE userName= @User AND passWord = @Password", conn)
            With sqlCom.Parameters
                .Add("@User", OleDbType.VarChar, 100).Value = userBox.Text
                .Add("@Password", OleDbType.VarChar, 100).Value = passwordBox.Text
            End With
            conn.Open()
            AdminType = sqlCom.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 = "SuperAdmin" Then
            welcomeFrm.Show()
            Me.Hide()
        ElseIf AdminType = "Admin" Then
            manageEmployeeForm.Show()
        End If
    End If
End Sub
0 голосов
/ 04 марта 2020

Смысл чтения данных заключается в чтении данных. Если вы когда-либо читали устройства чтения данных и их использование, то вы знаете, что вам нужно вызвать метод Read, чтобы фактически прочитать запись. Вы не звоните Read, следовательно, в вашем ридере нет данных.

...