Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要帮助来微调查询吗_C#_Performance - Fatal编程技术网

C# 需要帮助来微调查询吗

C# 需要帮助来微调查询吗,c#,performance,C#,Performance,您好,我有一个更新查询,它工作得很好,但是我需要大约3-4秒才能成功更新messagebox。你能帮我看看出了什么问题吗?是因为using()和事务回滚吗 public void Update() { System.Data.Common.DbTransaction transaction = null; using (JamminDataContext db = new JamminDataContext()) {

您好,我有一个更新查询,它工作得很好,但是我需要大约3-4秒才能成功更新messagebox。你能帮我看看出了什么问题吗?是因为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();
            }
        }
    }

在tx.Commit()之前对db.SubmitChanges()进行一次调用,而不是执行所有单独的db.SubmitChanges()。让我知道这是否提高了性能。它应该防止多次往返数据库,从而提高总体性能

这可以在存储过程中完成吗?是的,但现在想存储过程都太晚了。我必须坚持下去。不管怎样,要改进它吗?我应该同时使用()和transaction.rollback编写吗?谢谢,但是我需要提交changes(),这样我就可以分别获得id以插入到另一个表中..啊,我明白了。在这种情况下,没有解决办法。您必须一次插入一个以生成自动ID。您是否在直接连接到数据库的Web服务器上执行此操作?或者这是一个桌面应用程序与远程数据库对话?在同一网络中,Web服务器与数据库对话的3-4秒听起来相当高。