Синтаксис выражений ИЛИ в Visual Basic

0

Вопрос

Я знаю Visual Basic не так хорошо, как C++ или C#.

Я собираюсь проверить, есть ли у запроса select какие-либо результаты в возвращенном "testDataset" и есть ли некоторые результаты, поэтому я написал ниже синтаксис:

If ((testDataset Is Nothing) Or (testDataset.Tables Is Nothing) Or testDataset.Tables.Count = 0 _
    Or (testDataset.Tables.Item(0).Rows Is Nothing) Or (testDataset.Tables.Item(0).Rows.Count = 0) _
    Or (testDataset.Tables.Item(0).Rows(0) Is Nothing)) Then
    MessageBox.Show("Dataset has no results!", "Database Query Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Return False
End If

В C++ , когда выражение внутри логического ИЛИ сбывается, следующее выражение не будет обработано. Но, похоже, в Visual Basic это не так. Поэтому я хочу знать, как я могу проверить несколько выражений в visual basic и остановить обработку следующих, если одно из них сбылось.

Поэтому мой вопрос в основном можно задать в виде двух вопросов:

  1. Как я могу проверить несколько условий, используя ИЛИ не обрабатывая следующие?

  2. Как я могу проверить, есть ли в наборе данных результаты (по крайней мере, в одной строке), и в этой (по крайней мере, в одной) строке присутствует определенный столбец?

dataset logical-or vb.net
2021-11-23 11:33:48
3

Лучший ответ

2

Вы можете использовать условный оператор null для короткого замыкания всех этих проверок в одной строке. То ? после того, как участник в этой цепочке прекратит оценку последующих участников и вернет значение null, если этот участник равен нулю.

Return testDataset?.Tables?.Item(0)?.Rows?.Any() ' true if any, false if none
2021-11-23 15:30:43

Это интересная идея для нескольких проверок (+1). Вопрос в том, почему набор данных может быть пустым или таблицы(0) могут быть пустыми и т. Д. Я почти уверен, что просто try-catch блока достаточно.
Maciej Los

@MaciejLos Я научился экономно использовать обработку исключений, либо для того, чтобы ваше приложение не вышло из строя (полностью), либо для конкретного исключения, такого как UnauthorizedAccessException и т.д., и по возможности не включать это в логику вашей программы. Исключение является исключительным и не должно считаться нормальным. Конечно, ваш подход сработает... Но я просто рассматривал логику OP как нечто, что можно упростить с помощью некоторого элегантного синтаксиса. Спасибо за +1
djv

@MaciejLos Верно? Таким образом, сохраняя нулевые проверки в логике, ясно, что здесь происходит, в то время как Try...Catch заменяет и запутывает логику. Это скорее различие в лучших практиках и, возможно, немного слишком философское для ОП :)
djv

Я пытался сказать, что никогда не напишу код, который возвращает неизвестный результат. Когда функция, написанная мной, возвращает null (ничего), я делаю это намеренно... Я не могу согласиться с "нелогичной логикой" ;)
Maciej Los
1

Это излишне при проверке на Nothing. Предположительно, вы создали DataSet и наполнил его DataTable. В таблице может не быть возвращенных строк, но ни одна из DataSet ни тот DataTable это Ничто.

Если вы используете только одну таблицу, то обойдитесь без набора данных.

Private dt As New DataTable

Private Sub GetData()
    Using cn As New SqlConnection(ConLocal),
            cmd As New SqlCommand("Select Top 10 * From Coffees", cn)
        cn.Open()
        Using reader = cmd.ExecuteReader
            dt.Load(reader)
        End Using
    End Using
End Sub

Private Function CheckTable() As Boolean
    If dt.Rows.Count > 0 Then
        Return True
    End If
    MessageBox.Show("Dataset has no results!", "Database Query Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Return False
End Function
2021-11-23 12:32:53

Поскольку может быть много непредсказуемых случаев (например, таблица, столбцы которой могут быть не такими, как ожидалось,...), поэтому я не уверен, что, например, столбец x присутствует в таблице, так что может сложиться ситуация, когда все эти проверки необходимы (я думаю!)
VSB

@VSB Я уверен, что вы правы. В этом коде схема определяется результирующим набором, поэтому нет проблем с добавленными или отсутствующими столбцами. Я понимаю, что DBA может время от времени вносить критические изменения.
Mary
1

Вероятно, это не точный ответ, а общий совет...

Самый короткий способ поймать ошибку при чтении данных из набора данных-ввести код в Try...Поймать..Наконец-то блок.

Dim bRetVal As Boolean = True
Try
   'your code to read data
Catch ex As Exception
    MessageBox.Show("Something went wrong..." & vbCrLf  & vbCrLf & ex.Message, "Error while reading data", MessageBoxButtons.OK, MessageBoxIcon.Error)
    bRetVal = False
Finally
  Return bRetVal
2021-11-23 19:07:07

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................