我想知道SqlDataAdapter在内部是如何工作的,特别是当使用UpdateCommand更新一个巨大的DataTable时(因为从循环发送sql语句通常要快得多)。
以下是我想到的一些想法:
SqlCommand.Prepare()),其中CommandText已填充,并使用正确的sql类型初始化了CommandText参数。然后,它在需要更新的数据仓库上循环,对于每个记录,它更新参数值,并调用SqlCommand.ExecuteNonQuery()。SqlCommand对象,里面填充了所有内容(CommandText和sql参数)。然后将多个SqlCommands一次批处理到服务器(取决于UpdateBatchSize)。UpdateCommand ))。发布于 2012-12-19 23:05:30
它使用Server客户端类的内部工具,称为命令集。可以用一个命令将多个批处理发送到Server。这减少了每次通话的开销。服务器往返次数较少,诸如此类。
每条语句更新一行,每批发送一条语句,但每次往返发送多个批次。这份名单上的最后一点是神奇的酱汁。
不幸的是,这个工具是,没有公开公开的。Ayende对此进行了黑客攻击,并为此构建了一个私有的反射基API。
如果您需要更多信息,我鼓励您查看内部SqlCommandSet类。
也就是说,可以比这更快--:使用TVP传输更新数据,并发出一个更新多行的UPDATE。这样,您就可以节省每批、每次往返和每次报表的所有间接费用.
这样的查询如下所示:
update T set T.x = @src.x from T join @src on T.ID = @src.IDhttps://stackoverflow.com/questions/13962704
复制相似问题