[英]No Updates possible with replicated database and updating via tableadapter
[英]Updating a tableadapter with duplicated keys
我是更新數據庫的新手,顯然我不擅長。
細節 :
Primary Key
Me.CCListTableAdapter.Fill(Me.HQSdbDataSet.CCList)
填充Me.CCListTableAdapter.Fill(Me.HQSdbDataSet.CCList)
我正在嘗試做的是:
Dim ccDataTable As CCListDataTable = New CCListDataTable
然后,我嘗試使用以下命令將這些新行添加到tableadapter中:
Me.CCListBindingSource.EndEdit() Me.CCListTableAdapter.Update(ccDataTable)
但是它不起作用,並且我收到一個Violation of PRIMARY KEY [...] Cannot insert duplicate key
的SqlException
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.