我有一个包含12000条记录的Sql表,需要将其复制到另一个表中。
mset1 md = new mset1();
mset2 pd = new mset2();
foreach (var b in md.Myset) //dbset
{
Obj m = new Obj()
{
coslat = b.coslat,//float
Code = b.Code.Remove(b.Code.Length - 1),//string
sinlat = b.sinlat,//float
lat = b.lat,//float
lon = b.lon,//float
latrad = b.latrad,//float
lonrad = b.lonrad //float
};
pd.Postcodeset.Add(m);
pd.SaveChanges();
}
我想知道什么时候才能有效SaveChanges()
。它应该在For
循环内还是在For
循环之外。
编辑:我很担心,因为我有7 floats
而string Code
平均每个10kb。如果我不在For
循环中保存更改,我可能会耗尽内存。
答案 0 :(得分:2)
最好将它放在循环之外 - 这意味着一旦处理完成,数据层就会更新。
别的提及/建议:
将foreach
代码放在Try Catch
内,如果出现异常,请使用RollBack()
。这将“回滚”对数据库所做的任何更改,并避免产生负面影响 - de。
希望这有帮助。
答案 1 :(得分:0)
将它放在for循环之外。
您要添加到foreach中的集合(PostCodeSet
),但只需要提交一次集合,因此有必要拨打SaveChanges
一次而不是n
次。
答案 2 :(得分:0)
你应该移动
pd.SaveChanges();
在循环之外,所以你只对数据库进行1次调用。
答案 3 :(得分:0)
我总是把它放在for循环之外。不是出于性能原因,而是因为更改将在事务中完成。
我希望它的效率更高,因为您对数据库的请求更少。
答案 4 :(得分:0)
添加多行后,只需一个SaveChanges
的好处是所有更新都将在unit of work下完成。
如果批量插入物的高性能是您的首要要求,那么我相信您使用错误的工具 - 例如请改为SqlBulkCopy。
答案 5 :(得分:0)
你必须将其移到loop
之外。
在pd.Postcodeset
中添加数据后保存所有更改。