Składnia wyrażeń LUB w Visual Basic

0

Pytanie

Wiem Visual Basic nie jest tak dobrze, jak C++ lub C#.

Mam zamiar sprawdzić, czy zapytania select jakieś wyniki w zwróconej "testDataset" i czy niektóre wyniki, dlatego napisałem poniżej składnia:

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

W C++ , gdy wyrażenie wewnątrz logicznego LUB spełnia poniższe wyrażenie nie będzie rozpatrywana. Ale wydaje się, że w Visual Basic jest nie tak. Dlatego chcę wiedzieć, jak mogę sprawdzić kilka zwrotów w języku visual basic i zatrzymać przetwarzanie takich, jeśli jedno z nich się spełniło.

Dlatego moje pytanie w zasadzie można określić w postaci dwóch pytań:

  1. Jak mogę sprawdzić kilka warunków, używając LUB nie przetwarza następujące?

  2. Jak mogę sprawdzić, czy w zestawie danych wyniki (przynajmniej w jednym wierszu), i w tym (przynajmniej w jednym) w wierszu jest określony w kolumnie?

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

Najlepsza odpowiedź

2

Można użyć warunkowy operator null dla zwarcia tych wszystkich kontroli w jednym wierszu. To ? po tym, jak uczestnik w tym łańcuchu przestanie ocenę kolejnych uczestników i zwróci wartość null, jeśli ten zawodnik jest równy zero.

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

To ciekawy pomysł dla wielu kontroli (+1). Pytanie, dlaczego zestaw danych może być puste lub tabeli(0) mogą być puste itp. Jestem prawie pewien, że po prostu try-catch bloku wystarczy.
Maciej Los

@MaciejLos nauczyłem się oszczędnie korzystać z obsługi wyjątków, albo do tego, aby twoja aplikacja nie wyszło z akcji (w całości), albo dla konkretnego wyjątki, takie jak UnauthorizedAccessException itp., i w miarę możliwości nie zawierać to w logikę programu. Wyjątek jest wyjątkowy i nie powinno być uznane za normalne. Oczywiście, twoje podejście zadziała... Ale ja po prostu uważałem logiki OP jako coś, co można uprościć za pomocą jakiegoś eleganckiego składni. Dzięki za +1
djv

@MaciejLos Prawda? W ten sposób, zachowując zero sprawdzania w logice, jest jasne, co tu się dzieje, podczas gdy Try...Catch zastępuje i dezorientuje logiki. Jest to raczej różnica w najlepszych praktykach i, być może, trochę zbyt filozoficzna dla niego :)
djv

Próbowałem powiedzieć, że nigdy nie napiszę kod, który zwraca nieznany wynik. Gdy funkcja napisana mną, zwraca null (nic), robię to celowo... nie mogę się zgodzić z "nielogiczne logiką" ;)
Maciej Los
1

To niepotrzebnie podczas kontroli na Nothing. Podobno stworzył DataSet i napełnił go DataTable. W tabeli może nie być zwróconych wierszy, ale żaden z DataSet ani ten DataTable to Nic.

Jeśli używasz tylko jednej tabeli, to обойдитесь bez zestawu danych.

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

Ponieważ może być wiele nieprzewidywalnych przypadków (np. tabeli, której kolumny mogą być nie takie, jak oczekiwano,...), więc nie jestem pewien, że, na przykład, kolumna x występuje w tabeli, tak, że może powstać sytuacja, gdy wszystkie te kontrole są potrzebne (chyba!)
VSB

@VSB JESTEM pewien, że masz rację. W tym kodzie schemat określa результирующим zestaw, więc nie ma problemu z dodatkiem lub brakującymi kolumnami. Rozumiem, że DBA może od czasu do czasu wprowadzać te zmiany.
Mary
1

Prawdopodobnie nie jest to dokładne odpowiedzi, a wspólna rada...

Najszybszy sposób, aby złapać błąd podczas odczytywania danych ze zbioru danych-wpisać kod w Try...Catch..w Końcuto blok.

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

W innych językach

Ta strona jest w innych językach

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