簡體   English   中英

使用重復的鍵更新表適配器

[英]Updating a tableadapter with duplicated keys

我是更新數據庫的新手,顯然我不擅長。

細節 :

  • 我使用tableadapter(我不知道這是否是最好的方法)在.mdf文件中引用我的數據庫
  • 我的表有兩列,第一列是Primary Key
  • 該表已經有一些行
  • 我用: Me.CCListTableAdapter.Fill(Me.HQSdbDataSet.CCList)填充Me.CCListTableAdapter.Fill(Me.HQSdbDataSet.CCList)

我正在嘗試做的是:

  1. 我基於CCListTable創建一個新的數據表: Dim ccDataTable As CCListDataTable = New CCListDataTable
  2. 我使用CsvReader將具有新行(> 3000行)的.csv文件導入此新數據表。 我的數據庫中已經存在一些行
  3. 然后,我嘗試使用以下命令將這些新行添加到tableadapter中:

    Me.CCListBindingSource.EndEdit() Me.CCListTableAdapter.Update(ccDataTable)

但是它不起作用,並且我收到一個Violation of PRIMARY KEY [...] Cannot insert duplicate keySqlException Violation of PRIMARY KEY [...] Cannot insert duplicate key 好的,就像我說的,我知道有重復的鍵,但是我不想插入這些鍵,而只用新的行更新tableadapter。

這是我創建的用於導入CSV的子項(如果可以的話):

Public Sub ImportCSV2Data(ByVal filename As String, ByRef datatable As DataTable, ByVal column2Import() As Integer,
                          ByVal tableAlreadyExist As Boolean)

    Dim csvCopy As CachedCsvReader = New CachedCsvReader(New StreamReader(filename), True, ";"c)
    csvCopy.MissingFieldAction = MissingFieldAction.ReplaceByEmpty

    Dim headers() As String = csvCopy.GetFieldHeaders
    If column2Import.Length > 0 AndAlso column2Import(0) > -1 Then
        If tableAlreadyExist Then
            While csvCopy.ReadNextRecord()
                Dim csvRow As DataRow = datatable.NewRow
                Dim i As Integer = 0
                For Each column As Integer In column2Import
                    Select Case datatable.Columns(i).DataType.Name
                        Case "String"
                            If String.IsNullOrEmpty(csvCopy(column)) Then
                                csvRow(i) = ""
                            Else
                                csvRow(i) = Convert.ToString(csvCopy(column))
                            End If
                        Case "Int32"
                            If String.IsNullOrEmpty(csvCopy(column)) Then
                                csvRow(i) = DBNull.Value
                            Else
                                csvRow(i) = Convert.ToInt32(csvCopy(column))
                            End If
                        Case "Double"
                            If String.IsNullOrEmpty(csvCopy(column)) Then
                                csvRow(i) = DBNull.Value
                            Else
                                csvRow(i) = Convert.ToDouble(csvCopy(column))
                            End If
                        Case "DateTime"
                            If String.IsNullOrEmpty(csvCopy(column)) Then
                                csvRow(i) = Nothing
                            Else
                                csvRow(i) = Convert.ToDateTime(csvCopy(column))
                            End If
                        Case "Boolean"
                            If String.IsNullOrEmpty(csvCopy(column)) Then
                                csvRow(i) = DBNull.Value
                            Else
                                csvRow(i) = Convert.ToBoolean(csvCopy(column))
                            End If
                    End Select
                    i += 1
                Next
                datatable.Rows.Add(csvRow)
            End While
        Else
            For Each column As Integer In column2Import
                datatable.Columns.Add(headers(column))
            Next
            While csvCopy.ReadNextRecord()
                Dim csvRow As DataRow = datatable.NewRow
                Dim i As Integer = 0
                For Each column As Integer In column2Import
                    csvRow(i) = csvCopy(column)
                    i += 1
                Next
                datatable.Rows.Add(csvRow)
            End While
        End If
    Else
        If tableAlreadyExist Then
            While csvCopy.ReadNextRecord()
                Dim csvRow As DataRow = datatable.NewRow
                For i = 0 To csvCopy.FieldCount - 1
                    Select Case datatable.Columns(i).DataType.Name
                        Case "String"
                            If String.IsNullOrEmpty(csvCopy(i)) Then
                                csvRow(i) = ""
                            Else
                                csvRow(i) = Convert.ToString(csvCopy(i))
                            End If
                        Case "Int32"
                            If String.IsNullOrEmpty(csvCopy(i)) Then
                                csvRow(i) = DBNull.Value
                            Else
                                csvRow(i) = Convert.ToInt32(csvCopy(i))
                            End If
                        Case "Double"
                            If String.IsNullOrEmpty(csvCopy(i)) Then
                                csvRow(i) = DBNull.Value
                            Else
                                csvRow(i) = Convert.ToDouble(csvCopy(i))
                            End If
                        Case "DateTime"
                            If String.IsNullOrEmpty(csvCopy(i)) Then
                                csvRow(i) = Nothing
                            Else
                                csvRow(i) = Convert.ToDateTime(csvCopy(i))
                            End If
                        Case "Boolean"
                            If String.IsNullOrEmpty(csvCopy(i)) Then
                                csvRow(i) = DBNull.Value
                            Else
                                csvRow(i) = Convert.ToBoolean(csvCopy(i))
                            End If
                    End Select
                Next
                datatable.Rows.Add(csvRow)
            End While
        Else
            For Each header As String In headers
                datatable.Columns.Add(header)
            Next
            While csvCopy.ReadNextRecord()
                Dim csvRow As DataRow = datatable.NewRow
                For i = 0 To csvCopy.FieldCount - 1
                    csvRow(i) = csvCopy(i)
                Next
                datatable.Rows.Add(csvRow)
            End While
        End If
    End If
End Sub

我想念什么?

這是解決我的問題的代碼:

    'Create a DataTable with the same schema of your DataBase
    Dim ccDataTable As CCListDataTable = New CCListDataTable

    'Import here your csvFile into your new DataTable
    Call ImportCSV2Data(dialog2openFile.FileName, ccDataTable, {0, 2}, True)

    'Merge it with the correct DataTable from your Database (False to recognize the changes)
    Me.HQSdbDataSet.CCList.Merge(ccDataTable, False)

    'Then update your DataBase
    Me.CCListBindingSource.EndEdit()
    Me.CCListTableAdapter.Update(Me.HQSdbDataSet.CCList)

如果在調試模式下關閉應用程序時松開更改,那是正常的,因為在應用程序中有兩個數據庫,一個數據庫位於調試文件夾中,另一個數據庫在進入調試模式但啟動應用程序時會擦除另一個數據庫退出調試模式就可以了。 其他解決方案:在您的數據庫中,選擇“ NEVER COPY”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM