La sintaxis de expresiones O en Visual Basic

0

Pregunta

No sé de Visual Basic tanto como yo de saber C++ o C#.

Voy a comprobar si una consulta de selección resultados en devolvió 'testDataset` y tiene algunos de los resultados, así que escribí la sintaxis siguiente:

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

En C++ cuando una expresión dentro de la lógica O se cumple la expresión siguiente no será procesada. Pero este no parece ser el caso en Visual Basic. Quiero saber cómo puedo comprobar varias expresiones en visual basic y detener el procesamiento de la próxima si uno se hizo realidad.

Así que mi pregunta es, principalmente, se pueden plantear dos preguntas:

  1. ¿Cómo puedo comprobar varias condiciones de uso O sin el procesamiento de los siguientes?

  2. ¿Cómo puedo comprobar si el conjunto de datos tiene resultados (al menos una fila) y una columna específica está presente en que (al menos uno) de la fila?

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

Mejor respuesta

2

Usted puede utilizar el nulo operador condicional de cortocircuito todos los controles en una sola línea. El ? después de que el miembro de esta cadena se detendrá la evaluación posterior de los miembros y devolver null si el miembro es nulo.

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

Esta es una idea interesante para varios cheques (+1). La pregunta es ¿por qué un conjunto de datos a ser nulo o Tablas(0) puede ser null, etc. Estoy bastante seguro de que simplemente try-catch el bloque es suficiente.
Maciej Los

@MaciejLos he aprendido a utilizar el manejo de excepciones con moderación, ya sea para asegurarse de que su aplicación no se cuelgue (catch-all) o de una Excepción específica, tales como UnauthorizedAccessException etc., y siempre que sea posible, de no incorporar en la lógica del programa. Una Excepción es excepcional, y no debe ser considerado como normal. Por supuesto, su enfoque de trabajo... Pero acabo de ver OP lógica como algo que puede ser simplificado con algunos de elegante sintaxis. Gracias por el +1
djv

@MaciejLos Derecho? Así que mantener la nulos cheques en la lógica, es claro lo que está pasando aquí, mientras que un Try...Catch reemplaza y ofusca la lógica. Esto es más de una mejor práctica de la distinción, y tal vez un poco demasiado filosófico para el OP :)
djv

Yo estaba tratando de decir que nunca iba a escribir un código que devuelve resultado desconocido. Cuando una función escrita por mí devuelve null (nothing) yo lo hago intencionalmente... yo no puedo estar de acuerdo con "ilógica lógica" ;)
Maciej Los
1

Esta es la exageración en la comprobación de Nothing. Es de suponer que usted ha creado un DataSet y llena de una DataTable. La tabla no tiene ningún filas devueltas, pero ni el DataSet ni el DataTable no es Nada.

Si sólo utiliza una sola tabla, entonces prescindir del conjunto de datos.

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

Desde allí podría ser muchas ocasiones impredecible (como una tabla que sus columnas podrían no ser como se esperaba,...), así que no estoy seguro de que, por ejemplo, la columna x está presente en la tabla, por lo que podría ser la situación en la que todos estos controles son necesarios (supongo!)
VSB

@VSB estoy seguro de que usted tiene un punto. En este código, el esquema está determinado por el conjunto de resultados, así que no hay problema con el agregado o columnas que faltan. Entiendo DBA puede hacer romper cambia de vez en cuando.
Mary
1

Esto probablemente no es una respuesta exacta, pero en general el asesoramiento...

El camino más corto para la captura de error al leer los datos de un conjunto de datos es obtener un código en Try...Catch..Finally bloque.

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

En otros idiomas

Esta página está en otros idiomas

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