C# 使用DataAdapter进行批更新

C# 使用DataAdapter进行批更新,c#,.net,ado.net,dataset,dataadapter,C#,.net,Ado.net,Dataset,Dataadapter,在这种情况下,我需要执行一系列SQL更新命令。我知道数据集可以进行批量更新,但我唯一能够实现这一点的方法是首先将整个表加载到数据集中。如果我只想更新表中记录的子集,该怎么办?已编辑:根据您的评论,我建议先使用批量复制方法转到临时表。然后,您可以基于staging表对实际表进行一次更新 ========= 一种方法是自己构建SQL命令;但是,我建议您阅读SQL注入的可能性,以保护您自己。根据您的情况和平台,还有其他选择 例如,如果您正在处理大量数据,那么您可以将大容量导入到一个保留表中,然后在该保

在这种情况下,我需要执行一系列SQL更新命令。我知道数据集可以进行批量更新,但我唯一能够实现这一点的方法是首先将整个表加载到数据集中。如果我只想更新表中记录的子集,该怎么办?

已编辑:根据您的评论,我建议先使用批量复制方法转到临时表。然后,您可以基于staging表对实际表进行一次更新

=========

一种方法是自己构建SQL命令;但是,我建议您阅读SQL注入的可能性,以保护您自己。根据您的情况和平台,还有其他选择

例如,如果您正在处理大量数据,那么您可以将大容量导入到一个保留表中,然后在该保留表中发出一个单独的update命令。我还成功地将记录作为XML传递(我发现在我的环境中,我至少需要50行来抵消加载DOM的成本,并且我知道可伸缩性问题不是我的情况中的一个因素)

我看到的其他一些事情是人们将更新打包成一个二进制字段,例如每列一个二进制字段,然后他们有一个函数来解压二进制字段。同样,您需要使用您的环境进行测试

话虽如此,您是否已经验证了仅为每次需要的更新调用单个更新命令或存储过程是不够的?您甚至可能不需要对命令进行批处理

  • 乔希

小心过早的优化,它可能是致命的

EDITED:根据您的评论,我建议先使用批量复制方法转到暂存表。然后,您可以基于staging表对实际表进行一次更新

=========

一种方法是自己构建SQL命令;但是,我建议您阅读SQL注入的可能性,以保护您自己。根据您的情况和平台,还有其他选择

例如,如果您正在处理大量数据,那么您可以将大容量导入到一个保留表中,然后在该保留表中发出一个单独的update命令。我还成功地将记录作为XML传递(我发现在我的环境中,我至少需要50行来抵消加载DOM的成本,并且我知道可伸缩性问题不是我的情况中的一个因素)

我看到的其他一些事情是人们将更新打包成一个二进制字段,例如每列一个二进制字段,然后他们有一个函数来解压二进制字段。同样,您需要使用您的环境进行测试

话虽如此,您是否已经验证了仅为每次需要的更新调用单个更新命令或存储过程是不够的?您甚至可能不需要对命令进行批处理

  • 乔希

小心过早的优化,它可能是致命的

这里最简单的方法是用所需的行(您希望更新的行)加载表。再次检查行状态是否为“插入”。 使用执行“更新”的存储过程(包装在SqlCommand中)分配适配器的InsertCommand属性,此调整将确保表中的所有行都得到更新


这里最基本的是:DataAdapter对状态被更新的行运行UpdateCommand,对状态被插入的行运行InsertCommand,最后对状态被删除的行运行DeleteCommand。

最简单的方法是用所需的行(要更新的行)加载表。再次检查行状态是否为“插入”。 使用执行“更新”的存储过程(包装在SqlCommand中)分配适配器的InsertCommand属性,此调整将确保表中的所有行都得到更新


这里最基本的是:DataAdapter对状态被更新的行运行UpdateCommand,对状态被插入的行运行InsertCommand,最后对状态被删除的行运行DeleteCommand。

1000秒/秒。我可以用SQLBulkCopy处理添加,删除可以批处理到单个命令(“…where uniqueId in(…)”)中。但更新是个问题。我找到的唯一方法就是一次一个。。。是的,它的性能很差。好吧,那么为什么不使用SQLBulkCopy添加到临时保留表,然后从临时表对主表运行一次更新呢?这是一个很好的建议。很抱歉延迟回复。我要试试看。关于将临时表中的记录自动更新为真实记录的sql有什么建议吗?存储过程?没问题:-)存储过程可以工作,如果您动态创建实际表,您可能需要动态sql…选择一些可以工作的东西,首先让它工作,然后测试,然后优化;-)我正在处理每秒1000秒的问题。我可以用SQLBulkCopy处理添加,删除可以批处理到单个命令(“…where uniqueId in(…)”)中。但更新是个问题。我找到的唯一方法就是一次一个。。。是的,它的性能很差。好吧,那么为什么不使用SQLBulkCopy添加到临时保留表,然后从临时表对主表运行一次更新呢?这是一个很好的建议。很抱歉延迟回复。我要试试看。关于将临时表中的记录自动更新为真实记录的sql有什么建议吗?存储过程?没问题:-)存储过程可以工作,如果您动态创建实际表,您可能需要动态sql…选择一些可以工作的东西,首先让它工作,然后测试,然后优化;-)