2009-10-23 3 views
0

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

System.Data.ConstraintException был пойманы Message = "Колонка„рк“является вынужден быть уникальным. Значение '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 

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

ответ

0

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

Выгоды экс качестве исключения
Debug.Print (ex.ToString)

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

Имеют смысл?

+0

Функция DataTable.Merge может иметь функциональные возможности. Во-первых, если первичный ключ не установлен, он будет добавлять данные. Если первичный ключ таблицы установлен, то он будет использовать первичный ключ для обновления таблицы, поэтому моя путаница в этой ошибке. Кроме того, добавлено «Catch ex as ConstraintException» выше существующего «Catch ex as Exception», однако это все равно пустая трата циклов, если таблица не обновляется с моими значениями. –

0

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