2017-02-06 1 views
2

В моей программе есть опция «Выход из системы», чтобы вывести текущего пользователя из системы и вернуться на экран входа в систему, а не просто выйти всей программы.Отключить элементы управления формой для заданного временного предела, чтобы предотвратить неправильную логику

У меня есть база данных для правильного обновления при выходе из системы, однако, когда основная форма закрывается и возвращается на экран журнала, есть небольшая логическая ошибка.

Когда я ввожу имя пользователя и пароль, затем нажмите «Вход в систему» ​​и «Продолжить», отобразится MessageBox, чтобы показать, что текущий пользователь уже вошел в систему. Это функция, которую я реализовал, но она не должна показывать сообщение на этом этапе.

После того, как вы перешли и проверили базу данных, пользователь вышел из системы правильно, но база данных не обновилась достаточно быстро, поэтому кажется, что пользователь все еще зарегистрирован.

Пример:

я войти в систему как "user1", мой тестовый пользователь. Имя пользователя и пароль - «1».

Я выхожу, код исполняется.

На экран входа в систему, я использую следующий ключевой шаблон: + TAB + ввести имя пользователя и пароль 1 в соответствующих текстовых полях. Затем я использую . Введите + Введите, чтобы активировать кнопки, щелкнув события входа в систему и перейдите к кнопкам.

В общем, это занимает, возможно, секунду, максимум 2 секунды.

Однако это вызывает сообщение, в котором говорится, что пользователь уже вошел в систему.

Тем не менее, если я просто введи имя пользователя/пароль и подождал пару секунд, прежде чем нажимать «Вход в систему», значит, он отлично работает. Таким образом, база данных не уделяется времени на обновление.

Итак, есть способ отключить ведение журнала на элементах формы формы в течение секунды или двух, чтобы дать базе данных возможность зафиксировать изменения?

По существу, есть два способа, которыми я мог бы это сделать;

  • Я мог бы задержать основную формы закрытия в течение 2 секунд, перед закрытием/показывая журнал по форме (Попробованной с Application.DoEvents подпрограммы, но журнал по форме просто показал в любом случае, так как она всегда открыта в фоновом режиме

  • Или просто показать курсор ожидания, но отключить текстовые поля в течение 2 секунд, когда он получает сосредоточены

код для регистрации от процесса:.

sql = "UPDATE [System Settings] SET usersOnline = ?" 
Dim cmd As New OleDbCommand(sql, con) 
cmd.Parameters.Add("@users", OleDbType.VarChar).Value = users 
cmd.ExecuteNonQuery() 

Try 
    sql = "UPDATE [Users] SET [isOnline] = ? WHERE User_ID = ?" 
    Dim update As New OleDb.OleDbCommand(sql, con) 
    update.Parameters.Add("@isOn", OleDb.OleDbType.Boolean).Value = False 
    update.Parameters.Add("@ID", OleDb.OleDbType.VarChar).Value = user 
    update.ExecuteNonQuery() 
Catch 
End Try 

Войдите на кнопку Код:

For Each userRow In mainDBset.Tables(0).Rows 
    If userRow.Item("User_ID") = txtUser.Text And userRow.Item("Password") = txtPw.Text Then 

    If usersOnline >= maxUsers Then 
     MsgBox("Unable to log in, max user limit of '" & maxUsers.ToString & "' has been reached - '" & usersOnline & "' currently logged on.", MsgBoxStyle.OkOnly, "Max User Limit Reached") 
     Exit Sub 
    End If 

    sql = "SELECT * FROM [Users] WHERE [User_ID] = ?" 
    Dim checkCMD As New OleDb.OleDbCommand(sql, mainDBconnection) 
    Dim checkAdapter As New OleDb.OleDbDataAdapter(checkCMD) 
    checkAdapter.SelectCommand.Parameters.Add("@ID", OleDb.OleDbType.VarChar).Value = txtUser.Text 
    Dim cDt As New DataTable 
    Dim cDs As New DataSet 
    checkAdapter.Fill(cDs) 
    cDt = cDs.Tables(0).Copy() 

    If cDt.Rows(0).Item("isOnline") = True Then 
     MessageBox.Show("This user is already logged into the system, so cannot be logged in again.", "Error Logging On", MessageBoxButtons.OK) 
     Exit Sub 
    End If 
+0

Хммм ... Я никогда не слышал о сценарии, где это происходит, и данные базы данных не обновляются вовремя ... Есть ли возможность для вас закрыть соединение, а затем повторно открыть его, когда Вход в форму загружается? – David

+0

@ David Спасибо за ваше предложение, но нет, я уже пробовал это, база данных все еще говорит, что пользователь вошел в систему. Мне действительно нужна задержка, чтобы предотвратить ее. – Harambe

+0

Так что, чтобы быть понятным, вы говорите, что вызов функции обновления возвращается до завершения обновления? – peterG

ответ

1

Я решил эту проблему.

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

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

Чтобы устранить проблему, я удалил соединение при закрытии формы, а затем сбросил значения и повторно загрузил форму после вызова .ShowDialog() в событии click button.

Взял много отладки и нелегко объяснить, но закрытие соединения и повторная загрузка формы в исходное состояние исправили проблему, в основном.

+0

:) Рад, что нашел это ... Фоновый материал всегда бред для отладки. –

Смежные вопросы