ConstraintException не пойман - PullRequest
       22

ConstraintException не пойман

0 голосов
/ 18 марта 2019

Первый раз постер.Я наслаждался многолетней помощью здесь.Спасибо всем.

У меня такая ситуация, что этого не должно быть.

Используя VB.NET в сообществе VS2017, я получаю исключение System.Data.ConstraintException при попыткеблок, в котором я специально пойман в ловушку для этого точного исключения.

Вот как выглядит сообщение:

System.Data.ConstraintException: 'Column' PAIR1, PAIR2, PAIR3 'isвынужден быть уникальным.Значение '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, чтобы его не поймали.Другие исключения, да.

Любая помощь очень ценится.Надеюсь, я написал хороший вопрос.:)

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Я никогда не решал вопрос о том, почему генерируется исключение, хотя я явно поймал его в ловушку. Я прислушался к предложениям, чтобы проверить, существуют ли дубликаты, прежде чем пытаться добавить их в мою таблицу данных. Вот то, что я придумал, и это, кажется, работает просто отлично.

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

Еще раз спасибо всем, кто помог. Я сделал это через мой первый ТАК вопрос! Да!

0 голосов
/ 18 марта 2019

Я читал, что перехват исключений - довольно громоздкий способ управления потоком программ, и лучше предотвращать исключения.

Я думаю, что это Datatable, с которым вы имеете дело, поэтому следующий кусочек 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)

EDIT Код, написанный с вашими переменными и 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
...