1. 程式人生 > WINDOWS開發 >C# for迴圈 建立model 在迴圈裡和迴圈外引發的問題

C# for迴圈 建立model 在迴圈裡和迴圈外引發的問題

今天遇到一個非常難找的Bug,記錄下來以備不時之需。

做的這個程式是用來統計員工每天產量的,有正常班產量,和加班產量。如果該員工某天的產量已經提取過來,就更新原來記錄。如果沒有提取過就新增一條記錄。

大概過程是這樣的,假如有10個員工。

        /// <param name="strType">1代表正常班產量  2代表加班產量</param>
        private void GetWorkCount(string strType)
        {
            //建立產量記錄Model
            Model.WV_WorkRecord model = new Model.WV_WorkRecord();
            for (int i = 0; i < 10; i++)
            {
                bool flag;  //為了表示 是否存在產量記錄
                //員工ID
                int lngUserID=i;
                string strStartDate = "2020-01-01";

                model.WorkerID = lngUserID;
                //員工產量日期
                model.WorkDate = strStartDate;

                //
                ....這裡寫判斷是否存在產量記錄的程式碼
                 model2 = BLL.WV_WorkRecord.Instance.GetModel(" workId=" + lngUserID + " and workDate=‘" + strStartDate + "‘");
                ///
                if (flag)  //是否存在 產量記錄  存在更新原來記錄,不存在新增一條記錄
                {
                    model = model2;     //model2 是從資料庫裡取出來的原來就存在的那條記錄  

                    if (strType == "1")
                    {
                        //員工正常班產量
                        model.WorkCount = workCount;
                    }
                    else if (strType == "2")
                    {
                        //員工加班產量
                        model.WorkAddCount = workAddCount;
                    }
                    flag = BLL.WV_WorkRecord.Instance.Update(model);
                }
                else
                {
                    if (strType == "1")
                    {
                        //員工正常班產量
                        model.WorkCount = workCount;
                    }
                    else if (strType == "2")
                    {
                        //員工加班產量
                        model.WorkAddCount = workAddCount;
                    }
                    flag = BLL.WV_WORKRECORDD.Instance.Add(model);
                }

            }
        }

Model.WV_WorkRecord model = new Model.WV_WorkRecord(); 寫在了for迴圈外。你覺得有問題沒有?

我最開始寫外邊是考慮到放在迴圈裡,每次迴圈都需要New一個物件,如果迴圈次數太多,是不是太浪費記憶體資源了,所以就提到了for迴圈外,結果就造成了錯誤,而且很難排查問題。因為只有極個別記錄會有問題,所以也就造成了很難排查。

大家想一下這種情況,我現在要獲取加班產量記錄到資料庫,如果第1個人在資料庫裡已經有了記錄,這時候model就會指向資料庫裡已經有的那條記錄的model,緊接著獲取第2個人的加班產量,第2個人在資料庫裡沒有過記錄,

我要新增進去。你會發現你只通過 “model.WorkAddCount = workAddCount;” 這句程式碼修改了加班產量, 正常班產量確指向第1個人的正常班產量。所以以後要注意了,改寫迴圈裡就寫迴圈裡!

當然,也不是說所有情況都要放迴圈裡,特殊情況特殊對待!