复制表时出现约束异常?

Posted

技术标签:

【中文标题】复制表时出现约束异常?【英文标题】:Constraint Exception when copying table? 【发布时间】:2009-10-23 16:14:36 【问题描述】:

我在尝试修改某些 DataTable 对象时遇到了一些奇怪的行为。在第二次调用子例程时,将源 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

关于如何修复我的代码的任何想法或建议是否有更好的方法来更新我的表格?

【问题讨论】:

【参考方案1】:

从您的错误看来,您似乎正试图将相同的键添加到您的表中。我要做的是,从您的表中删除所有测试数据,然后代替通用数据:

将 ex 捕获为异常 Debug.Print(ex.ToString)

..实际上捕获主键异常(您上面列出的异常),然后做任何事情。例如,如果您知道会有主键违规(即,您可能有两个相同的 PK 并且只想要一个),那么忽略错误并继续。

有意义吗?

【讨论】:

DataTable.Merge 函数可以具有功能。首先,如果没有设置主键,它会追加数据。如果设置了表的主键,那么它将使用主键来更新表,因此我对这个错误感到困惑。此外,在现有的“Catch ex as Exception”之上添加了一个“Catch ex as ConstraintException”,但是,如果表没有使用我的值更新,这仍然是浪费周期。【参考方案2】:

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

【讨论】:

以上是关于复制表时出现约束异常?的主要内容,如果未能解决你的问题,请参考以下文章

将数据从本地复制到 S3 到 Redshift 表时出现问题

在同一活动工作簿中从一个工作表复制和粘贴到另一个工作表时出现错误 1004

装MySQL数据库时出现一个错误这怎么解决

设置数据库复制时启动快照代理时出现异常

通过上下文菜单将文本从edittext复制到剪贴板时出现异常?

雪花:加载时出现错误限制时无法复制?