2009-10-23 43 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

我會刪除主鍵,複製表,然後重新創建它。