2013-03-07 61 views
0

我遇到了一個問題,我使用數據適配器來更新然後重新填充數據表。調用填充方法後,該行會被複制。一個ID具有正確的(新)ID,另一個ID顯示-1。下面的代碼完美地工作,並且是我想要我的更復雜的代碼做的更簡單的形式。 Cosider以下:OleDbDataAdapter填充創建重複行

Imports WindowsApplication1.testDataSet 
Imports WindowsApplication1.testDataSetTableAdapters 
Imports System.Data.OleDb 
Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, _ 
    ByVal e As System.EventArgs) Handles Button1.Click 
     Dim DA As New testTableAdapter 
     Dim DT As New testDataTable 
     DA.Fill(DT) 
     Dim NR As testRow = DT.Rows.Add 
     NR.SomeText = "Test" 
     Dim DA2 As New OleDbDataAdapter("SELECT * FROM test", _ 
     DA.Connection.ConnectionString) 
     Dim CB As New OleDbCommandBuilder(DA2) 
     DA2.Update(DT) 
     DA.Fill(DT) 
     For Each R As testRow In DT.Rows 
      Debug.Print(R.ID) 
     Next 
    End Sub 
End Class 

上面的代碼工作完美。他們的關鍵列不顯示-1,沒有重複。現在考慮我的應用程序中的下面的代碼,它導致帶有鍵列的重複行在最後的LoadLoadNumbers()之後立即產生-1。

Dim AccountLoans As IEnumerable(Of LoanNumbersRow) = _ 
    From L As LoanNumbersRow In LoanNumbers _ 
    Select L Where L.AccountID = ID 

    If Not frmFindLoans.IsDisposed AndAlso _ 
    frmFindLoans.DialogResult = Windows.Forms.DialogResult.OK Then 
     For Each L As LoanNumbersRow In AccountLoans 
      If (From R As DataGridViewRow In frmFindLoans.dgvLoans.Rows _ 
      Select R Where R.Cells("LoanNumber").Value = L.LoanNumber).Count = 0 Then 
       If L.IsWhenDeletedNull Then 
        L.WhenDeleted = Now 
        L.DeletedBy = UserName() 
       End If 
      End If 
     Next 

     Dim NewLoan As LoanNumbersRow 
     Dim FindLoan As IEnumerable(Of LoanNumbersRow) 
     For Each R As DataGridViewRow In frmFindLoans.dgvLoans.Rows 
      FindLoan = From L As LoanNumbersRow In LoanNumbers.Rows _ 
      Select L Where L.LoanNumber = R.Cells("LoanNumber").Value And _ 
      L.AccountID = ID 
      If FindLoan.Count = 0 Then 
       NewLoan = LoanNumbers.Rows.Add 
       NewLoan.AccountID = Acc.AccountID 
       NewLoan.LoanNumber = R.Cells("LoanNumber").Value 
       NewLoan.LoanBusinessName = R.Cells("LoanBusiness").Value 
       NewLoan.LoanBorrower = R.Cells("LoanBorrower").Value 
       NewLoan.AddedBy = UserName() 
       NewLoan.WhenAdded = Now 
      End If 
     Next 
     Try 
      Dim CB As New OleDbCommandBuilder(LoanNumbersAdapter) 
      LoanNumbersAdapter.Update(LoanNumbers) 
     Catch ex As Exception 
      MsgBox(ex.Message, MsgBoxStyle.Critical, "Error saving loan number data") 
      Exit Sub 
     End Try 

     If Not LoadLoanNumbers() Then Exit Sub 
    End If 

其他變量,從模塊,例如:

Public LoanNumbersAdapter As OleDbDataAdapter 
Public LoanNumbers As New LoanNumbersDataTable 
Public Sub InitializeAdapters() 
    LoanNumbersAdapter = New OleDbDataAdapter(_ 
    "SELECT * FROM LoanNumbers WHERE WhenDeleted IS NULL ORDER BY WhenAdded DESC", AccountingConn) 
End Sub 
Public Function LoadData(ByVal DA As OleDbDataAdapter, ByVal DT As DataTable) As Boolean 
    Try 
     DA.Fill(DT) 
     Return True 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical, "Error loading the " & DT.TableName & " table") 
     Return False 
    End Try 
End Function 
Public Function LoadLoanNumbers() As Boolean 
    Return LoadData(LoanNumbersAdapter, LoanNumbers) 
End Function 

爲什麼在頂部做工精細簡單的測試,但我的實際應用中的關鍵列上創建重複行用-1?我想我可以在更新之前清空數據表,但是一旦它開始變成一張大桌子,它會不會讓它停滯不前? * BTW:數據庫是MS Access和它的.Net 3.5

回答

0

這是我的膠帶解:(

''' <summary> 
''' Removes any rows where the ID/key column is less than zero 
''' </summary> 
<Extension()> Public Sub DeleteRelics(ByVal DT As DataTable) 
    If DT.PrimaryKey.Count = 0 Then Exit Sub 
    For Each R As DataRow In _ 
    (From Rows As DataRow In DT.Rows _ 
    Select Rows Where Rows(DT.PrimaryKey.First.ColumnName) < 0) 
     R.Delete() 
    Next 
    DT.AcceptChanges() 
End Sub