1

我有一个包含 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不在循环内保存更改,我可能会用完内存。

4

6 回答 6

2

最好将它放在循环之外——这意味着一旦处理完成,数据层将被更新。

需要提及的其他内容/建议:将foreach代码放在 a中Try Catch,并RollBack()在出现异常的情况下使用。这将“回滚”对数据库所做的任何更改并避免产生负面影响 - de。

回滚功能

希望这可以帮助。

于 2013-09-03T11:42:25.570 回答
0

将其放在 for 循环之外。

您在 foreach 中添加到集合 ( ),但只需要提交一次集合,因此调用一次而不是多次PostCodeSet是有意义的。SaveChangesn

于 2013-09-03T11:38:45.390 回答
0

你应该搬家

pd.SaveChanges();

在循环之外,因此您只需对数据库进行 1 次调用。

于 2013-09-03T11:39:00.537 回答
0

我总是把它放在 for 循环之外。不是出于性能原因,而是因为更改将在事务中完成。

我希望它也会更有效,因为您对数据库的请求更少。

于 2013-09-03T11:40:07.167 回答
0

添加多行后只执行一次的好处SaveChanges是所有更新都将在一个工作单元下完成

如果批量插入的高性能是您的主要要求,那么我相信您使用了错误的工具来完成这项工作 - 例如,改为查看SqlBulkCopy 。

于 2013-09-03T11:40:23.107 回答
0

你必须把它移到loop.

添加数据后,它会保存所有更改pd.Postcodeset

于 2013-09-03T11:42:04.110 回答