как очистить предыдущий поиск из текстового поля? - PullRequest
0 голосов
/ 17 января 2019

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

Try
    myConnection.Open()  
    Dim str As String
    str = "SELECT * FROM tblEmp WHERE (EmpID = '" & ADS.UserEmpID & "')"
    Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
    dr = cmd.ExecuteReader
    While dr.Read
        If dr.HasRows > 0 Then
            MessageBox.Show("user already in the system", "Warning", MessageBoxButtons.OK)
        ElseIf dr.HasRows = 0 Then
            MessageBox.Show("Not Onboarded", "Warning", MessageBoxButtons.OK)
        End If
        BGC1 = dr("PreStartChecks").ToString
        BGC2 = dr("EmpName").ToString
        myConnection.Close()
    End While
Catch ex As Exception
    MsgBox("Unable to Connect to BGC DB. You may not have access or DB not available." &
        ex.ToString)
End Try

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Предполагая, что txtBGC1 и txtBGC2 являются текстовыми полями, вы можете сделать что-то вроде этого, предполагая, что запрос может вернуть максимум одного сотрудника

...
If dr.Read Then ' There is an employee
    txtBGC1.Text = dr("PreStartChecks").ToString
    txtBGC2.Text = dr("EmpName").ToString
Else ' There is no employee
    txtBGC1.Text = ""
    txtBGC2.Text = "No record found"
End If
myConnection.Close()
0 голосов
/ 17 января 2019

Ваш While цикл и If оператор не имеют смысла. Во-первых, HasRows - это тип Boolean, поэтому проверка, является ли он больше нуля, не имеет смысла. Во-вторых, Read возвращает False, если строк нет, поэтому единственный способ добраться до этого оператора If - это прочитать хотя бы одну строку, поэтому тестируйте HasRows, когда вы уже знаете, что строки есть. тоже бессмысленно. Правильным вариантом здесь является использование только оператора If и проверка только Read:

If dr.Read() Then
    'There is a row to read and it was just read, so you can now get the data from the reader.
Else
    'There is no row to read.
End If

Если вы хотите очистить элемент управления при отсутствии данных, вы делаете это в блоке Else.

«Правила» о том, когда и как использовать HasRows и Read, очень просты и логичны:

  • Если все, что вас волнует, - содержит ли набор результатов запроса данные или нет, но вам все равно, что это за данные, просто используйте оператор If для проверки HasRows. Свойство HasRows имеет тип Boolean, поэтому его не нужно ни с чем сравнивать. Это уже True или False.
  • Если в наборе результатов может быть только ноль или одна строка, просто используйте оператор If, чтобы вызвать Read и проверить результат. Опять же, это тип Boolean, поэтому нет необходимости сравнивать его с чем-либо. Если он возвращает True, то вы можете получить доступ к данным только что прочитанной строки.
  • Если может быть несколько строк, и вы не хотите делать ничего особенного, если строк нет, просто используйте цикл While или Do While, чтобы вызвать Read и получить доступ к строке, только что прочитанной внутри петля.
  • Если может быть несколько строк и вы хотите сделать что-то особенное, если строк нет, используйте оператор If для проверки HasRows, а затем цикл While или Do While внутри If блок для вызова Read. Вы бы справились со случаем, когда в блоке Else нет строк.
...