0

第一次海报。我在这里享受了多年的帮助。感谢大家。

我的情况看起来不应该发生。

在 VS2017 社区中使用 VB.NET,我在 Try 块中获得了 System.Data.ConstraintException,我专门为该异常捕获了该异常。

消息如下所示:

System.Data.ConstraintException:'列'PAIR1,PAIR2,PAIR3'被限制为唯一。值“CHATBTC,ETHBTC,CHATETH”已经存在。

https://www.dropbox.com/s/d91rgtwsjwioqhm/SO_error.jpg?dl=0

正如您从逻辑中可以看出的那样,我指望触发异常,以便我可以构建一个包含唯一行的表并添加到我的重复行值中。随着表的大小增加,在 ADD 之前检查重复项会花费大量时间,因此这种方法是最快的。

它不会每次都发生,只有大约 30%。我的应用程序还不足以在生产中运行,所以我看到的一切都是在调试时。

我的代码在这里:

  tblTriArbPairs.PrimaryKey = New DataColumn() {tblTriArbPairs.Columns("PAIR1"), tblTriArbPairs.Columns("PAIR2"), tblTriArbPairs.Columns("PAIR3")}

  Try
      tblTriArbPairs.Rows.Add(
    Pairs(0), Pairs(1), Pairs(2),
    idxPair0, idxPair1, idxPair2,
    result.TD1, result.TD2, result.TD3,
    CoinOnly(Pairs(0)), CurrOnly(Pairs(0)),
    CoinOnly(Pairs(1)), CurrOnly(Pairs(1)),
    CoinOnly(Pairs(2)), CurrOnly(Pairs(2)),
    FindLoopCoin(CoinOnly(Pairs(0)), CurrOnly(Pairs(0)), CoinOnly(Pairs(1)), CurrOnly(Pairs(1)), CoinOnly(Pairs(2)), CurrOnly(Pairs(2))),
    GetSymbolLIQ(Pairs(0)), GetSymbolLIQ(Pairs(1)), GetSymbolLIQ(Pairs(2))
    )
      RowsAdded += 1
  Catch ex As System.Data.ConstraintException
      DupRows += 1
  Catch ex As Exception
  Finally
  End Try

填充表格后,我最终添加了 3480 行和 2640 个重复项。错误发生的时间没有一致性。有时马上,有时几乎在最后。

我已经查看了所有内容,但没有找到任何解决未捕获的 ConstraintException 的内容。其他例外,是的。

很感谢任何形式的帮助。希望我发布了一个好问题。:)

4

2 回答 2

0

尽管我明确地为它捕获了异常,但我从未解决过为什么抛出异常的问题。在尝试将重复项添加到我的数据表之前,我确实注意到了此处的建议以检查是否存在重复项。这是我想出的,它似乎工作得很好。

Dim iRow As DataRow() = tblTriArbPairs.Select("PAIR1 = '" & Pairs(0) & "' AND PAIR2 = '" & Pairs(1) & "' AND PAIR3 = '" & Pairs(2) & "'")
If iRow.Count = 0 Then
    tblTriArbPairs.Rows.Add(
      Pairs(0), Pairs(1), Pairs(2),
      idxPair0, idxPair1, idxPair2,
      result.TD1, result.TD2, result.TD3,
      CoinOnly(Pairs(0)), CurrOnly(Pairs(0)),
      CoinOnly(Pairs(1)), CurrOnly(Pairs(1)),
      CoinOnly(Pairs(2)), CurrOnly(Pairs(2)),
      FindLoopCoin(CoinOnly(Pairs(0)), CurrOnly(Pairs(0)), CoinOnly(Pairs(1)), CurrOnly(Pairs(1)), CoinOnly(Pairs(2)), CurrOnly(Pairs(2))),
      GetSymbolLIQ(Pairs(0)), GetSymbolLIQ(Pairs(1)), GetSymbolLIQ(Pairs(2))
      )
    RowsAdded += 1
Else
    DupRows += 1
End If

再次感谢所有帮助过的人。我通过了我的第一个 SO 问题!是的!

于 2019-03-18T08:23:42.347 回答
0

我读过捕获异常是指导程序流程的一种相当麻烦的方法,最好防止异常。

我认为这是您正在处理的数据表,因此下面的 Linq 可能会起到作用。根据文档“一旦可以确定结果,源的枚举就会停止。”

我只是使用我的示例数据库进行测试。

    Dim CoffeeName As String = "Black Tiger"
    Dim CoffeeType = "Decaf"

    Dim dup As Boolean = dt.AsEnumerable().Any(Function(Row) CoffeeName = Row.Field(Of String)("Name") And CoffeeType = Row.Field(Of String)("Type"))
    MessageBox.Show(dup.ToString)

编辑 用您的变量和 3 个字段编写的代码。

    Dim dup As Boolean = tblTriArbPairs.AsEnumerable().Any(Function(Row) Pairs(0) = Row.Field(Of String)("Pair1") _
        And Pairs(1) = Row.Field(Of String)("Pair2") And Pairs(2) = Row.Field(Of String)("Pair3"))
    If dup Then
        DupRows += 1
        MessageBox.Show("Sorry, duplicate")
        Exit Sub
    End If
    'Add the row
于 2019-03-18T05:57:32.510 回答