La sintassi per le espressioni O in Visual Basic

0

Domanda

Non so Visual Basic per quanto conosco il C++ o C#.

Sto andando a controllare se una query di selezione alcun risultato in restituiti 'testDataset` e hanno alcuni risultati, così ho scritto di seguito la sintassi:

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

In C++ quando un'espressione all'interno di logiche O vero espressione successiva non verrà elaborato. Ma sembra che questo non è il caso in Visual Basic. Quindi voglio sapere come posso controllare diverse espressioni in visual basic e interrompere l'elaborazione successiva se uno si è avverato.

Quindi la mia domanda è principalmente può essere chiesto due domande:

  1. Come posso verificare diverse condizioni di utilizzo O senza l'elaborazione successiva?

  2. Come posso verificare se il Dataset contiene i risultati (almeno una riga e una colonna specifica è presente (almeno una) riga?

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

Migliore risposta

2

È possibile utilizzare il null operatore condizionale di cortocircuito, tutti i controlli in una sola riga. Il ? dopo il membro di questa catena di arrestare la valutazione successiva membri e restituire null se il membro è nullo.

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

Questa è un'idea interessante per diversi controlli (+1). La domanda è perché DataSet di un essere null o Tabelle(0) può essere null, etc. Sono abbastanza sicuro che semplicemente try-catch il blocco è sufficiente.
Maciej Los

@MaciejLos ho imparato a usare la gestione delle eccezioni con parsimonia, per assicurare che l'applicazione non crash (catch-all) o per una specifica Eccezione come UnauthorizedAccessException ecc.... e ogni volta che è possibile, di non incorporare la logica del tuo programma. Un'Eccezione è eccezionale, e non deve essere considerato normale. Naturalmente, il vostro approccio funziona... Ma ho appena visto OP logica come a qualcosa che può essere semplificato con alcuni eleganti sintassi. Grazie per il +1
djv

@MaciejLos Giusto? In modo talmente semplice mantenere aggiornati i controlli nulli nella logica, è chiaro quello che sta succedendo qui, mentre un Try...Catch sostituisce e offuscare la logica. Questo è più di una best practice distinzione, e forse un po ' troppo filosofico per l'OP :)
djv

Stavo cercando di dire che non ho mai scrivere un codice che restituisce il risultato sconosciuto. Quando una funzione scritta da me restituisce null (nothing) io lo faccio intenzionalmente... posso essere d'accordo con "illogica logica" ;)
Maciej Los
1

Questo è eccessivo sul controllo per Nothing. Presumibilmente hai creato un DataSet e riempito con una DataTable. La tabella non possono avere qualsiasi numero di righe restituite, ma né l' DataSet né il DataTable è Nulla.

Se si utilizza solo un singolo tavolo, quindi di abbandonare il set di dati.

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

Dato che ci potrebbero essere molti imprevedibili occasioni (ad esempio una tabella, in cui le colonne potrebbero non essere come previsto,...), quindi non sono sicuro che ad esempio la colonna x è presente nella tabella, quindi potrebbe essere la situazione che tutti questi controlli sono necessari (credo!)
VSB

@VSB sono sicuro che si dispone di un punto. In questo codice, lo schema è determinato dal set di risultati quindi nessun problema con l'aggiunta o colonne mancanti. Capisco DBA e ' possibile apportare modifiche di rilievo di tanto in tanto.
Mary
1

Questo - probabilmente - non è una risposta esatta, ma un consiglio generale...

La via più breve per la cattura di errore durante la lettura dei dati dal set di dati è quello di ottenere un codice in Try...Catch..Finally blocco.

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

In altre lingue

Questa pagina è in altre lingue

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