KD209 Ответов: 3

Vb.net проблема сравнения строк


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

Что я уже пробовал:

Using fetchconn As New OleDbConnection(connStr)
     Using cmdfetch As New OleDbCommand()
         cmdfetch.Connection = fetchconn
         cmdfetch.CommandText = "Select AssetBarcode from TrackingInfo Where AssetBarcode = ? AND CheckedOut = True"

         cmdfetch.Parameters.AddWithValue("AssetBarcode", ChkInBarcode.Text)

         fetchconn.Open()

         Using fetchreader As OleDbDataReader = cmdfetch.ExecuteReader(CommandBehavior.CloseConnection)


             While fetchreader.Read()

                 If String.Equals(ChkInBarcode.Text, fetchreader("AssetBarcode"), StringComparison.OrdinalIgnoreCase) Then

                     'Do Nothing

                 Else

                     MessageBox.Show("This item has not been checked out. Please inform the Helpdesk")

                     Me.Close()

                     Return
                 End If
             End While
         End Using
     End Using
 End Using

3 Ответов

Рейтинг:
26

Richard Deeming

Проблема довольно очевидна:

  • Ваш запрос возвращает только те строки, где AssetBarcode столбец равен ChkInBarcode.Text;
  • Затем вы зацикливаетесь на этих строках, и если AssetBarcode столбец равен ChkInBarcode.Text- ты ничего не делаешь;
  • Если нет совпадающих строк, то вы тоже ничего не делаете;

Это сработало в ваш предыдущий вопрос[^] потому что запрос и код проверяли одно и то же условие. (Этот вариант был бы лучше использовать с помощью SELECT Count(*) ... и ExecuteScalar как и предполагал Грифф.)

В этом случае вам также нужно будет рассмотреть, что произойдет, если штрих-кода не существует. Например:
Using fetchconn As New OleDbConnection(connStr)
    Using cmdfetch As New OleDbCommand()
        cmdfetch.Connection = fetchconn
        cmdfetch.CommandText = "Select CheckedOut from TrackingInfo Where AssetBarcode = ?"
        cmdfetch.Parameters.AddWithValue("AssetBarcode", ChkOutBarcode.Text)
        
        fetchconn.Open()
        
        Dim result As Object = cmdfetch.ExecuteScalar()
        
        If result Is Nothing Then
            MessageBox.Show("This item does not exist. Please inform the Helpdesk")
            Me.Close()
            
        Else If Not CBool(result) Then
            MessageBox.Show("This item has not been checked out. Please inform the Helpdesk")
            Me.Close()
        End If
    End Using
End Using


Рейтинг:
2

OriginalGriff

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

fetchconn.Open()
И доведите свой код до конца.
Скорее всего, вы обнаружите, что while цикл никогда не вводится, что означает, что ни одна строка не соответствует вашим критериям; или что команда SQL не удалась и произошло исключение.
Почему? Не знаю - и мы не можем узнать, потому что у нас нет доступа к вашим данным, поэтому мы не можем проводить тесты в тех же условиях, что и вы. Так что вам придется использовать отладчик и точно выяснить, что происходит.

Но этот код немного глуп: ваш SQL может просто вернуть COUNT (*) вместо набора строк и использовать ExecuteScalar, чтобы проверить, соответствуют ли какие-либо строки вашему условию. С тех пор как ваш
if проверяет только ту же строку, что и ваша WHERE во всяком случае, проверять это еще раз излишне! Я бы сначала выяснил, что происходит, исправил это, а затем рефакторировал бы это в гораздо более чистый и простой код!


Рейтинг:
0

Patrice T

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя-отладчик. Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Visual Basic / Visual Studio Video Tutorial-Базовая Отладка-YouTube[^]
Visual Basic .NET programming for Beginners - точки останова и инструменты отладки[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.