Свойство ExecuteScalar.Connection не было инициализировано - PullRequest
0 голосов
/ 01 октября 2019
    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        If txtUsername.Text = Nothing Or txtPassword.Text = Nothing Then
            MsgBox("Enter Credential", MsgBoxStyle.Exclamation)
        End If
            If connection.State = ConnectionState.Closed Then
            connection.Open()
        End If
        Dim cmd As New OleDbCommand("select count (*) from Admin where username = ? and password = ?, connection")
        cmd.Parameters.AddWithValue("@1", OleDbType.VarChar).Value = txtPassword.Text
        cmd.Parameters.AddWithValue("@2", OleDbType.VarChar).Value = txtUsername.Text
        Dim count = Convert.ToInt32(cmd.ExecuteScalar())
        If (count > 0) Then
            MsgBox("Login Succeed", MsgBoxStyle.Information)
        Else
            MsgBox("Account not found check credentials", MsgBoxStyle.Critical)
        End If
    End Sub
End Class

Любой, пожалуйста, помогите мне с этим кодом ... это для формы входа

1 Ответ

1 голос
/ 01 октября 2019

Вы захотите выйти из Sub, если ваша проверка не пройдена. Оператор Return выполняет это.

Вы можете объявить счетчик вне блоков Using. Вы будете показывать окна сообщений после подсчета количества, и мы не хотим, чтобы соединения оставались открытыми, пока пользователь отвечает на окно сообщения, поэтому мы выполняем оценку за пределами блоков Using.

Сохраняем ваши объекты базы данных локальными, чтобы вы моглиможет контролировать, когда они закрыты и расположены. Using...End Using блоки выполнят это, даже если возникнет ошибка.

Исправьте ваш OleDbCommand конструктор, как сказал @MathieuGuindon в своем комментарии.

Я так рад видеть, что параметры используются так, чтоЯ не решаюсь пожаловаться, но метод .Add предпочтительнее. http://www.dbdelta.com/addwithvalue-is-evil/ и https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ и еще один: https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications Вот еще один https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html На самом деле, вы как бы смешиваете 2 метода. Второй параметр .AddWithValue ожидает значение, а не OleDbType. Он имеет тип Object, поэтому он не вызывает ошибку компиляции, но взорвется при попадании в базу данных.

Не открывайте соединение до тех пор, пока соединения .Execute Connections не станут ценным ресурсом, поэтомуя не хочу держать их открытыми дольше, чем необходимо.

И, наконец, НИКОГДА не храните пароли в виде простого текста. Я оставлю это вам для исследования солей и хэширования для защиты паролем.

Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
    If String.IsNullOrWhiteSpace(txtUsername.Text) OrElse String.IsNullOrWhiteSpace) txtPassword.Text) Then
        MsgBox("Enter Credential", MsgBoxStyle.Exclamation)
        Return
    End If
    Dim count As Integer
    Using connection As New OleDbConnection("Your connection string")
        Using cmd As New OleDbCommand("select count (*) from Admin where username = ? and password = ?", connection)
            cmd.Parameters.Add("@1", OleDbType.VarChar).Value = txtPassword.Text
            cmd.Parameters.Add("@2", OleDbType.VarChar).Value = txtUsername.Text
            connection.Open()
            count = Convert.ToInt32(cmd.ExecuteScalar())
        End Using
    End Using 'Closes and Disposes the connection
    If count > 0 Then
        MessageBox.Show("Login Succeed", "Login", MessageBoxButtons.OK, MessageBoxIcon.Information)
    Else
        MessageBox.Show("Account not found check credentials", "Login", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...