【问题标题】:sqldataadapter inserting duplicate rows in destination tablesqldataadapter在目标表中插入重复行
【发布时间】:2021-04-03 13:57:35
【问题描述】:

我正在使用 .NET 并使用 sqldataadapter 从一个数据源获取数据并更新另一个数据源。但问题是每次在目标表中插入重复行。

   Dim sqlconl As SqlConnection = New SqlConnection(conl) --LOCAL SQL CONNECTION
   Dim sqlconr As SqlConnection = New SqlConnection(conr) --REMOTE SQL CONNECTION
   Dim dsl As New DataSet()  --DSL AS DATASET
   Dim dal As New SqlDataAdapter()  --DAL AS SQLDATAADAPTER

    dal.SelectCommand = New SqlCommand("select * from TxnDependents where Personalized='1'", sqlconl)
    dal.AcceptChangesDuringFill = False
    dal.Fill(dsl, "TxnDependents")`
    Dim dar1 As New SqlDataAdapter("select * from TxnDependents", sqlconr)
    Dim U1 As SqlCommandBuilder = New SqlCommandBuilder(dar1)
    dar1.Update(dsl, "TxnDependents")
    dsl.Dispose()
    dal.Dispose()

【问题讨论】:

  • 这就是造成问题的所有代码吗?数据集的本地加载和远程连接上的更新之间是否有一些代码? AFAIK,您不应该使用此代码获得任何更新,因为所有行都处于未更改的行状态。
  • 不,这就是我的全部。它正在工作,但每次使用新数据插入旧数据(之前已经插入)时。
  • 我的问题是我无法设置任何条件,例如 dal.SelectCommand = New SqlCommand("select * from TxnDependents where Personalized='1' and URN not in (Select URN from txndependent,sqlconr)" , sqlconl)
  • 在远程使用临时表来加载本地数据。 (您应该在每次新加载之前 TRUNCATE)然后您可以编写查询,使用相同的远程连接仅更新新记录

标签: vb.net dataset sqldataadapter


【解决方案1】:

当然;第一个查询不会选择目标表中已经存在的行,因此将再次添加它们

想象一下:

Source Table      Dest Table
Id, Name          Id, Name
1, Matthew        
2, Mark
3, Luke

然后你选择所有,并更新(插入),所以你有:

Source Table      Dest Table
Id, Name          Id, Name
1, Matthew        1, Matthew
2, Mark           2, Mark
3, Luke           3, Luke

然后向源表添加更多行:

Source Table      Dest Table
Id, Name          Id, Name
1, Matthew        1, Matthew
2, Mark           2, Mark
3, Luke           3, Luke
4, John

然后你选择所有并再次插入到目标表中:

Source Table      Dest Table
Id, Name          Id, Name
1, Matthew        1, Matthew
2, Mark           2, Mark
3, Luke           3, Luke
4, John           1, Matthew
                  2, Mark
                  3, Luke
                  4, John

每次这样做,都会导致越来越多的重复

也许考虑一下:

SELECT MAX(id) as maxid FROM destination --retrieve this into C#
SELECT * FROM source WHERE id > @maxid   --pass the max id into this query that pulls the source data

如果您的 ID 是 guid 或排序不好,请使用其他内容,例如 CreatedDate 列(源中的任何行,其 createddate 大于 dest 中的 max createddate,假设复制了 dest 日期,而不是计算为它真正插入的日期,这可能会导致一些记录丢失)。

如果您没有其他任何东西,您将不得不做一些乏味的事情,例如从目标表中选择所有 ID,而不是从源表中选择这些 ID。实际上,最好有一个列来控制/跟踪数据是否已传输,或者有一个您可以选择的列(如创建的日期或数字序列)以防止降低您已经传输的数据

【讨论】:

  • 是的,如果所有源行中的 RowState 都将标记为 DataRowState.Added,则会发生这种情况,但情况似乎并非如此。如果在调用 Fill 之后它们具有 RowStete = DateRowState.Unchanged,则最终更新将永远不会向目标表添加行(或更新或删除)。问题与 OP 所提出的不同
  • 我想你没有注意到 OP 的 AcceptChangesDuringFill = False 代码行...在填充过程中添加的所有行都有一个已添加的 DataRowState
  • 啊,我现在看到了,简直是一头雾水!
  • 那么.. 重复数据输入到目标表中的原因是什么? Acceptchangesduringfill=true 能解决问题吗??
  • @DIPANKAR 没有;请再读一遍我的回答,让我知道在你不明白发生了什么之前你得到了什么部分
猜你喜欢
  • 1970-01-01
  • 2010-12-10
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多