2011-06-29 65 views
1

嗨,我有這個更新查詢哪些工作正常,但只需要大約3-4秒才能成功地獲取消息框更新。你能幫忙看看出了什麼問題嗎?是因爲使用()和事務回滾?需要幫助來微調查詢

public void Update() 
    { 
     System.Data.Common.DbTransaction transaction = null; 
     using (JamminDataContext db = new JamminDataContext()) 
     { 
      try 
      { 
       db.Connection.Open(); 
       transaction = db.Connection.BeginTransaction(); 
       db.Transaction = transaction; 

       #region Update Users 
       db.Users.Attach(this, GetSingleUserById(this.Id)); 
       db.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, db.Users); 
       db.SubmitChanges(); 
       #endregion 

       if (this.RoleId == (int)RoleTypes.Student) 
       { 
        #region Update CourseByStudents 
        foreach (CourseByStudent courseByStudent in this.courseByStudent) 
        { 
         if (courseByStudent == null) break; 
         if (courseByStudent.Id == 0) 
         { 
          courseByStudent.CourseUserStatus.UserId = this.Id; 
          db.CourseUserStatus.InsertOnSubmit(courseByStudent.CourseUserStatus); 
          db.SubmitChanges(); 

          courseByStudent.StudentId = this.Id; 
          courseByStudent.CourseUserStatusId = courseByStudent.CourseUserStatus.Id; 
          db.CourseByStudents.InsertOnSubmit(courseByStudent); 
          db.SubmitChanges(); 
         } 
         else 
         { 
          if(courseByStudent.CourseUserStatusCopy != courseByStudent.CourseUserStatus.Status 
           && (courseByStudent.CourseUserStatus.Status != null 
           && courseByStudent.CourseUserStatus.Date != null)) 
          { 
           //Insert to CourseUserStatus only when Status is change or add new row of course 
           courseByStudent.CourseUserStatus.UserId = this.Id; 
           db.CourseUserStatus.InsertOnSubmit(courseByStudent.CourseUserStatus); 
           db.SubmitChanges(); 

           courseByStudent.CourseUserStatusId = courseByStudent.CourseUserStatus.Id; 
          } 
          courseByStudent.Update(); 
         } 
        } 
        #endregion 
       } 

       transaction.Commit(); 
      } 
      catch (Exception ex) 
      { 
       if (transaction != null) transaction.Rollback(); 
       Logger.Error(typeof(User), ex); 
       throw; 
      } 
      finally 
      { 
       if (db.Connection.State == System.Data.ConnectionState.Open) db.Connection.Close(); 
      } 
     } 
    } 
+0

這可以在存儲過程中完成嗎? – kheya

+0

是的,但我甚至想到商店的程序爲時已晚。我將不得不堅持這一點。無論如何改善它?我應該使用()還是transaction.rollback? – VeecoTech

回答

0

而不是做所有的個人db.SubmitChanges的()做一個調用db.SubmitChanges()的tx.Commit前右()。讓我知道這是否會提高性能。它應該防止許多往返數據庫,從而提高整體性能。

+0

謝謝,但我需要提交Changes(),以便我可以分別將ID插入到另一個表中。 – VeecoTech

+0

啊我明白了。在這種情況下,沒有解決方法。您必須一次創建一個插入來生成自動ID。你是否在直接連接數據庫的網絡服務器上執行此操作?或者這是一個與遠程數據庫交談的桌面應用程序?從網絡服務器與同一網絡中的數據庫通話時,3-4秒聽起來相當高。 – oazabir