首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OleDbDataAdapter填充创建重复行

OleDbDataAdapter填充创建重复行
EN

Stack Overflow用户
提问于 2013-03-08 05:35:39
回答 1查看 739关注 0票数 1

我遇到了一个问题,我使用数据适配器更新数据表,然后再重新填充。在调用fill方法之后,该行被复制。一个ID具有正确的(新) ID,另一个ID显示为-1。下面的代码运行得很好,并且是我希望更复杂的代码完成的更简单的形式。请考虑以下几点:

代码语言:javascript
复制
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。

代码语言:javascript
复制
    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

来自模块的其他变量等:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2013-03-09 02:31:56

这是我的胶带解决方案:(

代码语言:javascript
复制
''' <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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15282220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档