2010-10-01 133 views
0

我在ASP.Net MVC 1.0工作和SQL Server 2000中使用实体框架。 低于我的控制器出现故障代码给出:在SQL Server 2000 MARS

  int checkUser = id ?? 0; 
      string userNameFromNew, userNameToNew; 

      if (checkUser == 1) 
      { 
       userNameFromNew = "U" + Request.Form["usernameFrom"]; 
       userNameToNew = "U" + Request.Form["usernameTo"]; 
      } 
      else 
      { 
       userNameFromNew = "C" + Request.Form["usernameFrom"]; 
       userNameToNew = "C" + Request.Form["usernameTo"]; 
      } 

      var rMatrix = from Datas in repository.GetTotalRightData() 
          where Datas.UserName == userNameFromNew.Trim() 
          select Datas; 

      Right_Matrix RM = new Right_Matrix(); 


      foreach(var Data in rMatrix) 
      { 
       RM.Column_Id = Data.Column_Id; 
       RM.ProMonSys_Right = Data.ProMonSys_Right; 
       RM.UserName = userNameToNew; 
       UpdateModel(RM); 
       this.repository.AddRightTransfer(RM); 
      } 

      return RedirectToAction("RightTransfer"); 

我的故障模式的代码如下:

我的代码显示错误一旦它在型号代码说明DataReader的是已经打开,并且我需要先关闭它。

请提出一个解决办法。

回答

1

尝试移动AddRightTransfer环出LINQ的foreach的,并到一个单独的一个。我认为在数据库结果集关闭之前,LINQ正在执行第一次添加。通过将呼叫转移到第二个foreach,你应该避免这个问题,如果这是发生了什么。

下面是一个例子:

List<Right_Matrix> matrixes = new List<Right_Matrix>(); 

foreach (var Data in rMatrix) 
{ 
    Right_Matrix rm = new Right_Matrix(); 
    rm.Column_Id = Data.Column_Id; 
    rm.ProMonSys_Right = Data.ProMonSys_Right; 
    rm.UserName = userNameToNew; 
    UpdateModel(rm); 
    matrixes.Add(rm); 
} 

foreach (var rm in matrixes) 
{ 
    this.repository.AddRightTransfer(rm); 
} 
+0

OK,如果可能的话,请给我提供了一些代码来做到这一点。 – 2010-10-01 08:18:58

+0

非常感谢,你的回答解决了我的目的。 – 2010-10-01 10:52:50

0

的问题是,要修改的数据库,同时还超过它迭代。无论是修改前完成查询,例如:

foreach(var Data in rMatrix.ToArray()) 

还是不要在你的循环修改数据库的,就像这样:

 foreach(var Data in rMatrix) 
     { 
      RM.Column_Id = Data.Column_Id; 
      RM.ProMonSys_Right = Data.ProMonSys_Right; 
      RM.UserName = userNameToNew; 
      UpdateModel(RM); 
      context.AddObject("Right_Matrix", RM); 
     } 
     context.SaveChanges(); 

显然,这两个context.通话将不得不被制作成方法在你的仓库,但你得到的图片。

+0

谢谢,我会尝试并回复。 – 2010-10-01 08:31:00