2011-06-29 11 views
1

こんにちは私はうまくいきますが、メッセージボックスの更新がうまくいくまでに3〜4秒かかるだけです。あなたは何がうまくいかないのを見るのを助けることができますか? using()とトランザクションのロールバックが原因ですか?クエリを細かくチューニングするのに助けが必要

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

はい、店の手続きについて考えるのは時期尚早です。私はこれに固執する必要があります。とにかくそれを改善するには?私はusing()とtransaction.rollbackの両方を書くべきですか? – VeecoTech

答えて

0

代わりに、すべての個々のdb.SubmitChangesをやって())(右tx.Commit前db.SubmitChangesに1つの()の呼び出しを行います。これによりパフォーマンスが向上するかどうかお知らせください。データベースへの多くのラウンドトリップを防ぎ、全体のパフォーマンスを向上させるはずです。

+0

ありがとう、しかし、私は別のテーブルに挿入するためにそれぞれIDを得ることができるようにsubmitChange()する必要があります。 – VeecoTech

+0

ああ私が参照してください。その場合、回避策はありません。自動IDを生成するには、一度に1つずつ挿入する必要があります。あなたはデータベースに直接接続しているウェブサーバーでこれをやっていますか?または、これはリモートデータベースと対話するデスクトップアプリケーションですか?同じネットワーク内のデータベースと話しているウェブサーバーから3〜4秒がかなり高いです。 – oazabir

関連する問題