Syntaxe NEBO výrazy v jazyce Visual Basic

0

Otázka

Já nevím, Visual Basic, stejně jako já vím, C++ nebo C#.

Jdu se podívat, jestli select dotazu mít nějaké výsledky v vrácena 'testDataset a mít nějaké výsledky, tak jsem napsal níže syntaxi:

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

V C++, když výraz uvnitř logické NEBO splní další vyjádření nebudou zpracovány. Ale zdá se, že to není případ v jazyce Visual Basic. Takže chci vědět, jak mohu zkontrolovat, zda některé výrazy v jazyce visual basic a zastavit zpracování další, pokud jedno splnilo.

Takže moje otázka je hlavně můžete být požádáni jako dvě otázky:

  1. Jak mohu zkontrolovat několik podmínkou je pomocí NEBO bez zpracování další?

  2. Jak mohu zkontrolovat, zda-li Dataset má výsledky (alespoň jeden řádek) a konkrétní sloupec, je přítomen v tom, že (alespoň jeden) řádek?

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

Nejlepší odpověď

2

Můžete použít null podmíněné operátor na zkrat všechny ty kontroly v jedné linii. Na ? poté, co člen tohoto řetězce se zastaví vyhodnocování následných členů a vrátit null, pokud člen je null.

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

To je zajímavý nápad, aby několik kontrol (+1). Otázkou je, proč DataSet být null nebo Tabulky(0) může být null, atd. Jsem si jistý, že jednoduše try-catch blok je dost.
Maciej Los

@MaciejLos jsem se naučil používat výjimek šetrně, buď aby zajistily, že vaše aplikace nespadne (catch-all), nebo na specifické Výjimky, např. UnauthorizedAccessException atd., a kdykoliv je to možné, aby ji začlenit do logiky programu. Výjimkou je mimořádné, a neměl by být považován za normální. Samozřejmě, váš přístup bude fungovat... Ale já viděl jen OP je logika jak něco, který by mohl být zjednodušen s některými elegantní syntaxe. Díky za +1
djv

@MaciejLos Ne? Takže udržet se null šeky v logice, je jasné, co se tady děje, zatímco Try...Catch nahrazuje a zastírá logiku. Je to více o nejlepší praxi rozdíl, a možná až příliš filozofické na OP :)
djv

Snažil jsem se říct, že jsem nikdy psát kód, který vrátí neznámý výsledek. Když funkce napsal mi vrátí null (nic) dělám to záměrně... nemůžu souhlasit s "nelogické logiky" ;)
Maciej Los
1

Je to overkill na kontrolu Nothing. Pravděpodobně jste si vytvořili DataSet a naplnil ji s DataTable. Stůl nemusí mít žádné řádky, které jsou vráceny, ale ani DataSet ani DataTable je Nic.

Pokud používáte pouze jednu tabulku, pak obejít se bez objektu DataSet.

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

Protože tam by mohlo být mnoho nepředvídatelné příležitostech (jako je tabulka, která jeho sloupce nemusí být, jak se očekávalo,...), takže si nejsem jistý, že např. sloupec x je přítomen v tabulce, takže by to mohla být situace, že všechny tyto kontroly jsou nezbytné (asi!)
VSB

@VSB jsem si jist, že máte pravdu. V tomto kódu, schéma je určeno výsledek nastavit, takže žádný problém s přidané nebo chybějící sloupce. Chápu, DBA je, aby lámání změny, občas.
Mary
1

To - asi - není přesná odpověď, ale obecné rady...

Nejkratší způsob, jak chytit chyby při čtení dat z datového souboru je dostat kód do Try...Catch..Konečně bloku.

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

V jiných jazycích

Tato stránka je v jiných jazycích

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