2009-10-23 61 views
0

当我尝试修改某些DataTable对象时,遇到了一些奇怪的行为。在第二次调用子程序,我得到以下错误,当我到源数据表复制到工作集:复制表时约束异常?

System.Data.ConstraintException被 抓消息=“列‘PK’是 受限于值是唯一的。值 '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

从你的错误看起来你似乎试图将相同的密钥添加到你的表中。我会做的是,从表中删除所有的测试数据,然后,而不是通用的:

抓住EX作为例外
Debug.Print(ex.ToString)

..actually抓住主键例外(上面列出的例外),然后做任何事情。例如,如果您知道会有主键违规(即您可能有两个相同的PK并且只需要一个),那么只需忽略该错误并继续。

有意义吗?

+0

DataTable.Merge函数可以具有功能。首先,如果主键未设置,它将追加数据。如果表的主键被设置,那么它将使用主键来更新表,因此我对这个错误感到困惑。 另外,在现有的'Catch ex作为异常'之上添加'Catch ex as ConstraintException',但是,如果表没有更新我的值,这仍然浪费周期。 – 2009-10-23 16:28:24

0

我会删除主键,复制表,然后重新创建它。