मेरे पास लगभग 21000 पंक्तियों वाली एक एक्सेल फ़ाइल है। मैंने इसे अपने डेटाबेस में एक अस्थायी तालिका में आयात किया।

अब मैं अपने डेटा पर कुछ रूपांतरण करना चाहता हूं और फिर उन्हें अपनी मुख्य तालिका में रखना चाहता हूं।

जब मैं SaveChanges() एक foreach के अंदर करता हूं तो मुझे निम्न त्रुटि मिली:

Microsoft.Data.SqlClient.SqlException: 'New transaction is not allowed because there are other threads running in the session

जब मैं foreach के बाद इसका उपयोग करता हूं तो कोई त्रुटि नहीं होती है और तालिका में सभी 21000 रिकॉर्ड के बजाय केवल 4 रिकॉर्ड डाले गए हैं जिनकी मुझे उम्मीद थी।

     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");
-1
alireza naseri Moghaddam 2 जून 2021, 21:08

4 जवाब

सबसे बढ़िया उत्तर

आपके कोड में एक बग है। आपने लूप के बाहर एल घोषित और बनाया है। हर बार आप एक ही L जोड़ते हैं, केवल भिन्न डेटा के साथ। अंत में आपके पास उसी डेटा की सूची है जो पिछले फ़ोरैच लूप चक्र के दौरान बनाया गया था।

ये कोशिश करें:

        foreach (var item in db.TempLeaves)
        {
          var z = int.Parse(item.LT) - 1; 
           var L = new Leave{
            Pcode = Int32.Parse(item.Cod),
            LeaveTimeStart = StringToHour(item.LeaveTimeStart),
            LeaveTimeEnd = StringToHour(item.LeaveTimeEnd),
            LeaveDays = int.Parse(item.LeaveDays),
            LT = z == 0? Leave.LeaveType.Saati : Leave.LeaveType.Roozane
            };     
           db.Leaves.Add(L);
        }

या यह

  var leaves= new List<Leave>();
 foreach (var item in db.TempLeaves)
        {
            var z = int.Parse(item.LT) - 1; 
           var L = new Leave{
            Pcode = Int32.Parse(item.Cod),
            LeaveTimeStart = StringToHour(item.LeaveTimeStart),
            LeaveTimeEnd = StringToHour(item.LeaveTimeEnd),
            LeaveDays = int.Parse(item.LeaveDays),
            LT = z == 0? Leave.LeaveType.Saati : Leave.LeaveType.Roozane
             };     
           leaves.Add(L);
        }
   if(leaves.Count>0)
{
   db.Leaves.AddRange(leaves);
  db.SaveChanges();
}

अगर आप एसिंक सेव का उपयोग करना चाहते हैं तो आपको पहले एसिंक एक्शन करना होगा।

1
Serge 3 जून 2021, 14:13

*आखिरकार इस कोड ने काम किया:

public ActionResult FeedTempdataToMainDB()
{
    var leaves = new List<Leave>();
    foreach (var item in db.TempLeaves)
    {
        var L = new Leave();
        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);
        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 && t == false)
        {
            L.Calculate = false;

            L.IsActive = false;
        }
        else { L.Calculate = true; L.IsActive = true; }
        leaves.Add(L);
    }

    if (leaves.Count > 0)
    {
        db.Leaves.AddRange(leaves);
        db.SaveChanges();
    }

    return RedirectToAction("index");
}
-1
alireza naseri Moghaddam 23 जून 2021, 08:56

हर बार जब सेवचेंज को निष्पादित किया जाता है, तो एक ऐसा धागा होता है जिसे आप नियंत्रित नहीं करते हैं। चूंकि इकाई ढांचा सेवचेंज फ़ंक्शन का प्रबंधन कर रहा है। आपको foreach के बाद अपने savechnages को निष्पादित करना होगा या async फ़ंक्शन का उपयोग करना होगा।

1
YacineSM 2 जून 2021, 22:11

यहाँ async के लिए एक उदाहरण है:

private static async Task<Student> GetStudent()

{छात्र छात्र = शून्य;

using (var context = new SchoolDBEntities())
{
    Console.WriteLine("Start GetStudent...");
          
    student = await (context.Students.Where(s => s.StudentID == 1).FirstOrDefaultAsync<Student>());
        
    Console.WriteLine("Finished GetStudent...");
}

return student;

}

1
YacineSM 3 जून 2021, 00:11