【问题标题】:Syntax for OR expressions in Visual BasicVisual Basic 中 OR 表达式的语法
【发布时间】:2022-01-01 21:39:28
【问题描述】:

我对 Visual Basic 的了解不如我对 C++ 或 C# 的了解。

我要检查一个选择查询是否在返回的'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++ 中,当逻辑 OR 中的表达式为真时,将不处理下一个表达式。但在 Visual Basic 中似乎并非如此。所以我想知道如何检查 Visual Basic 中的多个表达式,如果一个表达式为真,则停止处理下一个表达式。

所以我的问题主要可以分为两个问题:

  1. 如何使用 OR 来检查多个条件而不处理下一个条件?

  2. 如何检查 Dataset 是否有结果(至少一行)并且该行中是否存在特定列?

【问题讨论】:

  • 您可能正在寻找OrElseAndAlso
  • 虽然你提到了 C++,但它与问题本身并不真正相关,所以我删除了 C++ 语言标签。
  • 您要查找的术语是short-circuit evaluation。它可能会帮助您在搜索时找到更好的匹配。

标签: vb.net dataset logical-or


【解决方案1】:

您可以使用null conditional operator 将所有这些检查短路到一行中。此链中成员后的? 将停止评估后续成员,如果成员为null,则返回null。

Return testDataset?.Tables?.Item(0)?.Rows?.Any() ' true if any, false if none

【讨论】:

  • 这对几个检查 (+1) 来说是一个有趣的想法。问题是为什么 DataSet 可以为 null 或 Tables(0) 可以为 null 等等。我很确定只需 try-catch 块就足够了。
  • @MaciejLos 我学会了谨慎使用异常处理,以确保您的应用程序不会崩溃(包罗万象)或针对特定异常(例如 UnauthorizedAccessException 等),并尽可能,而不是将其合并到程序的逻辑中。异常是异常的,不应被视为正常。当然,您的方法会奏效……但我只是将 OP 的逻辑视为可以通过一些优雅的语法来简化的东西。感谢您的 +1
  • @MaciejLos 对吗?因此,将空检查保留在逻辑中,很清楚这里发生了什么,而Try...Catch 替换并混淆了逻辑。这更像是一个最佳实践的区别,对于 OP 来说可能有点过于哲学了 :)
  • 我想说我永远不会编写返回未知结果的代码。当我编写的函数返回 null(什么都没有)时,我是故意这样做的……我不能同意“不合逻辑的逻辑”;)
【解决方案2】:

检查Nothing 是多余的。大概您创建了一个DataSet 并用DataTable 填充它。该表可能没有返回任何行,但 DataSetDataTable 都不是 Nothing。

如果您只使用单个表,则无需使用 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

【讨论】:

  • 由于可能有许多不可预知的情况(例如其列可能不符合预期的表格,...),所以我不确定例如列x 存在于表中,因此可能是所有这些检查都是必要的(我猜!)
  • @VSB 我相信你说得有道理。在此代码中,模式由结果集确定,因此添加或丢失列没有问题。我了解 DBA 偶尔会做出重大更改。
【解决方案3】:

这 - 可能 - 不是一个确切的答案,而是一般建议......

从数据集中读取数据时捕获错误的最短方法是将代码放入Try...Catch..Finally 块中。

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

【讨论】:

    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2012-07-17
    相关资源
    最近更新 更多