当前位置: 代码迷 >> C# >> .net sqlbulkcopy+sql server重复数据处理解决方案
  详细解决方案

.net sqlbulkcopy+sql server重复数据处理解决方案

热度:182   发布时间:2016-05-05 04:33:36.0
.net sqlbulkcopy+sql server重复数据处理

    Dim sbc As New SqlBulkCopy(conn.ConnectionString, SqlBulkCopyOptions.Default) 'conn是一个sqlconnection
        sbc.BulkCopyTimeout = 900
        sbc.DestinationTableName = tableName'tableName是目标数据表名称
    Try
        sbc.WriteToServer(dt)'dt是包含待插入数据库的源数据的datatable
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try


用以上代码可以将表 dt 的所有记录批量插入 tableName 表
但是现在碰到个非常棘手的问题:目标表里是有数据的,当dt中某条(某些)记录与tableName表中的记录重复时,会取消插入,有没有办法忽略这些约束冲突并且继续插入所有不重复的内容?
当然如果只追求结果的话,倒是可以将datatable里的内容逐条插入,捕获到异常后直接略过处理并继续处理下一条。但是这样做的话,运行效率会被上述方案甩出65535条长安街,尤其是大数据量的情况下。
也看过另外一种解决方案,取消原表的约束,全部插入数据,删除数据表中的重复记录,但如果原始表数据很大的话,仍然会比较慢,而且这种办法本身也挺危险的。
或者各位有什么更给力一点的办法可以实现需求呢?先谢谢各位
------解决思路----------------------
写个存储过程,让它到数据库里去判断
循环写入慢,主要是因为需要反复通信,在数据库里的效率其实差不多的
------解决思路----------------------
我感觉   还是 先把你的dt 中的数据过滤一遍  再copy。 至于查询是否有重复的,那就创建索引查询试试。
------解决思路----------------------
引用:

    Dim sbc As New SqlBulkCopy(conn.ConnectionString, SqlBulkCopyOptions.Default) 'conn是一个sqlconnection
        sbc.BulkCopyTimeout = 900
        sbc.DestinationTableName = tableName'tableName是目标数据表名称
    Try
        sbc.WriteToServer(dt)'dt是包含待插入数据库的源数据的datatable
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try


用以上代码可以将表 dt 的所有记录批量插入 tableName 表
但是现在碰到个非常棘手的问题:目标表里是有数据的,当dt中某条(某些)记录与tableName表中的记录重复时,会取消插入,有没有办法忽略这些约束冲突并且继续插入所有不重复的内容?
当然如果只追求结果的话,倒是可以将datatable里的内容逐条插入,捕获到异常后直接略过处理并继续处理下一条。但是这样做的话,运行效率会被上述方案甩出65535条长安街,尤其是大数据量的情况下。
也看过另外一种解决方案,取消原表的约束,全部插入数据,删除数据表中的重复记录,但如果原始表数据很大的话,仍然会比较慢,而且这种办法本身也挺危险的。
或者各位有什么更给力一点的办法可以实现需求呢?先谢谢各位

这种操作肯定不会频繁使用,所以随便找一种解决方案就行了!
------解决思路----------------------
先从数据库里取出主键来,然后用这个主键去被同步的数据库里查询,比它大的就是新的
当然这只能同步增加的部分,哪些改了是不知道的
而且按你之前的思路,改掉的,你也不让插入
  相关解决方案