Ограничение Исключение при копировании таблицы? - PullRequest
0 голосов
/ 23 октября 2009

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

System.Data.ConstraintException было поймано сообщение = "столбец" рк " вынужден быть уникальным. Значение 'path0.tag0' уже присутствует. "

Для контекста я определяю первичный ключ таблицы данных в этом фрагменте кода.

itemsTable.Columns.Add("pk")

For Each itemrow As DataRow In itemsTable.Rows
    itemrow.Item("pk") = itemrow.Item("path").ToString + itemrow.Item("tag")
Next

Dim keyColumns() As DataColumn = {itemsTable.Columns("pk")}
itemsTable.PrimaryKey = keyColumns

Затем я обновляю таблицу, используя код в этой подпрограмме

Private Sub DataChange(ByVal ClientHandles As Array, ByVal CurrentValues As Array, ByVal QualityValueArray() As String) _
        Handles myOpcData.DataChange

    Dim updateTable As New DataTable
    Try
        updateTable = itemsTable.Copy <-----Exception happens here

        For index As Integer = 1 To ClientHandles.Length
            updateTable.Rows(ClientHandles(index)).Item("value") = CurrentValues(index)
        Next

        itemsTable.Merge(updateTable)

    Catch ex As Exception
        Debug.Print(ex.ToString)
    End Try
End Sub

Любые идеи о том, как исправить мой код или предложение, если есть лучший способ обновления моей таблицы?

Ответы [ 2 ]

0 голосов
/ 23 октября 2009

Я бы удалил первичный ключ, скопировал бы таблицу и затем воссоздал ее.

0 голосов
/ 23 октября 2009

Судя по вашей ошибке, вы пытаетесь добавить тот же ключ в вашу таблицу. Что бы я сделал, удалите все тестовые данные из своей таблицы, а затем вместо универсального:

Catch ex As Exception
Debug.Print (ex.ToString)

.. фактически перехватывает исключение первичного ключа (исключение, которое вы перечислили выше) и затем делаете что угодно. Например, если вы знаете, что будут нарушения первичного ключа (т. Е. У вас может быть два одинаковых PK и вам нужен только один), просто проигнорируйте ошибку и продолжайте.

Имеет смысл?

...