• 1400/03/13
  • 0
  • 379
1400/03/13 |
backend

خطای New transaction is not allowed because there are other threads running in the session

با سلام

بنده یک دیتا بیس فاکس با 21000 رکورد داشتم که دیتا را تبدیل و به یک table موقت در دیتابیس sql انتقال دادم چون دیتا نیاز به ادیت داشت و اغلب رشته ای بود .

قطعه کد زیر با هدف اینکه رکوردهای جدول موقت را خوانده و بعد از اعمال تغییرات به جدول اصلی انتقال دهد نوشته شده.

در کد زیر اگر از دستور db.savechange داخل حلقه استفاده شود خطای ذکر شده در عنوان بالا ظاهر می شود ولی اگر دستور در خارج از حلقه باشد هم بعد از خروج از حلقه فقط چند رکورد اندک در تیبل اصلی درج می شود. لازم بذکر است که دستور  db.SaveChangesAsync را هم داخل حلقه تست میکنم تفاوت این هست که خطا اتفاق نمی افتد ولی ظاهرا برنامه از loop نیز خارج نمی شود.

 

 

     public ActionResult FeedTempdataToMainDB()
        {
            
            var L = new Leave();
            //  var leaves = new List<Leave>();
            foreach (var item in db.TempLeaves)
            {
                L.Pcode = Int32.Parse(item.Cod);
                var z = int.Parse(item.LT) - 1;
                if (z == 0) L.LT = Leave.LeaveType.Saati;
                else L.LT = Leave.LeaveType.Roozane;
                var o = int.Parse(item.DLT) - 1;
                if (o == 0) L.DLT = Leave.DLType.Estehghaghi;
                if (o == 1) L.DLT = Leave.DLType.Estelaji;
                else L.DLT = Leave.DLType.Bihoghoogh;
                L.LeaveDayStart = item.LeaveDayStart.Old6digToMiladi();
                L.LeaveDayEnd = item.LeaveDayEnd.Old6digToMiladi();
                L.LeaveTimeStart = StringToHour(item.LeaveTimeStart);
                L.LeaveTimeEnd = StringToHour(item.LeaveTimeEnd);
                L.LeaveDays = int.Parse(item.LeaveDays);
                L.LeaveMinuts = SaatiLengh(item.LeaveMinuts);
                L.RegDate = StringToHour(item.RegTime);
                L.RegDate = item.RegDate.Old6digToMiladi().Date;
                L.RegistrarCode = Int32.Parse(item.RegistrarCode);
                L.HijriYear = L.LeaveDayStart.GetHijriYear();
                var t = IsOk(item.RegTime);
                if (L.DLT == 0 && t == false || L.LT == 0)
                {
                    L.Calculate = false;

                    L.IsActive = false;
                }
                else { L.Calculate = true; L.IsActive = true; }
                db.Leaves.Add(L);
                db.SaveChangesAsync();
            }
            //db.SaveChanges();
            return RedirectToAction("index");
     

 

 

 


سلام

کدها رو اینطوری تغییر بده

            List<Leave> leaves = new List<Leave>();
            foreach (var item in db.TempLeaves)
            {
                leaves.Add(new Leave
                {
                    Pcode = Int32.Parse(item.Cod);
                var z = int.Parse(item.LT) - 1;
                if (z == 0) L.LT = Leave.LeaveType.Saati;
                else L.LT = Leave.LeaveType.Roozane;
                var o = int.Parse(item.DLT) - 1;
                if (o == 0) L.DLT = Leave.DLType.Estehghaghi;
                if (o == 1) L.DLT = Leave.DLType.Estelaji;
                else L.DLT = Leave.DLType.Bihoghoogh;
                LeaveDayStart = item.LeaveDayStart.Old6digToMiladi();
                LeaveDayEnd = item.LeaveDayEnd.Old6digToMiladi();
                LeaveTimeStart = StringToHour(item.LeaveTimeStart);
                LeaveTimeEnd = StringToHour(item.LeaveTimeEnd);
                LeaveDays = int.Parse(item.LeaveDays);
                LeaveMinuts = SaatiLengh(item.LeaveMinuts);
                RegDate = StringToHour(item.RegTime);
                RegDate = item.RegDate.Old6digToMiladi().Date;
                RegistrarCode = Int32.Parse(item.RegistrarCode);
                HijriYear = L.LeaveDayStart.GetHijriYear();
                var t = IsOk(item.RegTime);
                if (L.DLT == 0 && t == false || L.LT == 0)
                {
                    Calculate = false;

                    IsActive = false;
                }
                else { Calculate = true; IsActive = true; }

            });
        }
        DBNull.leaves.AddRange(leaves)
        db.SaveChanges();
            return RedirectToAction("index");

 


البته اون آخر اشتباه تایپی بود که dbNull افتاده و اون قسمت همون db است


با سلام و تشکر جناب عباس نژاد بابت پاسخ شما

متاسفانه کدهای داخل حلقه خطای سینتکسی دارند لطفا یکبار داخل محیط ویژوال استودیو کپی و ملاحظه کنید.


اگر در کدها باگ ملاحظه کردید بخاطر این است که من تمام L. هارا که دیدم برداشتم ولی در شرطها و جاهای دیگر هم این L. وجود دارد لطفا آنها را بردارید کد ها بدون اشکال میشوند

    List<Leave> leaves = new List<Leave>();
            foreach (var item in db.TempLeaves)
            {
                leaves.Add(new Leave
                {
                    Pcode = Int32.Parse(item.Cod);
                var z = int.Parse(item.LT) - 1;
                if (z == 0) LT = Leave.LeaveType.Saati;
                else LT = Leave.LeaveType.Roozane;
                var o = int.Parse(item.DLT) - 1;
                if (o == 0) DLT = Leave.DLType.Estehghaghi;
                if (o == 1) DLT = Leave.DLType.Estelaji;
                else DLT = Leave.DLType.Bihoghoogh;
                LeaveDayStart = item.LeaveDayStart.Old6digToMiladi();
                LeaveDayEnd = item.LeaveDayEnd.Old6digToMiladi();
                LeaveTimeStart = StringToHour(item.LeaveTimeStart);
                LeaveTimeEnd = StringToHour(item.LeaveTimeEnd);
                LeaveDays = int.Parse(item.LeaveDays);
                LeaveMinuts = SaatiLengh(item.LeaveMinuts);
                RegDate = StringToHour(item.RegTime);
                RegDate = item.RegDate.Old6digToMiladi().Date;
                RegistrarCode = Int32.Parse(item.RegistrarCode);
                HijriYear = LeaveDayStart.GetHijriYear();
                var t = IsOk(item.RegTime);
                if (DLT == 0 && t == false || LT == 0)
                {
                    Calculate = false;

                    IsActive = false;
                }
                else { Calculate = true; IsActive = true; }

            });
        }
        db.leaves.AddRange(leaves)
        db.SaveChanges();
            return RedirectToAction("index");

 



پاسخی برای این باگ ارسال کنید

لطفا کدها را درون قطعه کد ارسال نمایید

برای ارسال پاسخ باید وارد حساب کاربری خود شوید
ورود به حساب کاربری