इस कमांड से पहले से ही एक खुला DataReader जुड़ा हुआ है जिसे पहले बंद किया जाना चाहिए


640

मेरे पास यह क्वेरी है और मुझे इस फ़ंक्शन में त्रुटि मिली:

var accounts = from account in context.Accounts
               from guranteer in account.Gurantors
               select new AccountsReport
               {
                   CreditRegistryId = account.CreditRegistryId,
                   AccountNumber = account.AccountNo,
                   DateOpened = account.DateOpened,
               };

 return accounts.AsEnumerable()
                .Select((account, index) => new AccountsReport()
                    {
                        RecordNumber = FormattedRowNumber(account, index + 1),
                        CreditRegistryId = account.CreditRegistryId,
                        DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber),
                        AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)
                    })
                .OrderBy(c=>c.FormattedRecordNumber)
                .ThenByDescending(c => c.StateChangeDate);


public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
{
    return (from h in context.AccountHistory
            where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
            select h.LastUpdated).Max();
}

त्रुटि है:

इस कमांड से पहले से ही एक खुला DataReader जुड़ा हुआ है जिसे पहले बंद किया जाना चाहिए।

अपडेट करें:

स्टैक ट्रेस जोड़ा गया:

InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.]
   System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) +5008639
   System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) +23
   System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) +144
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +87
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
   System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10
   System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +443

[EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.]
   System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +479
   System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context, ObjectParameterCollection parameterValues) +683
   System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +119
   System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +38
   System.Linq.Enumerable.Single(IEnumerable`1 source) +114
   System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3(IEnumerable`1 sequence) +4
   System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +29
   System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +91
   System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(Expression expression) +69
   System.Linq.Queryable.Max(IQueryable`1 source) +216
   CreditRegistry.Repositories.CreditRegistryRepository.DateLastUpdated(Int64 creditorRegistryId, String accountNo) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1497
   CreditRegistry.Repositories.CreditRegistryRepository.<AccountDetails>b__88(AccountsReport account, Int32 index) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1250
   System.Linq.<SelectIterator>d__7`2.MoveNext() +198
   System.Linq.Buffer`1..ctor(IEnumerable`1 source) +217
   System.Linq.<GetEnumerator>d__0.MoveNext() +96

जवाबों:


1286

यदि आप किसी अन्य क्वेरी से परिणामों पर पुनरावृत्ति करते समय किसी क्वेरी को निष्पादित करते हैं तो यह हो सकता है। यह आपके उदाहरण से स्पष्ट नहीं है कि ऐसा कहां होता है क्योंकि उदाहरण पूर्ण नहीं है।

एक चीज जो इसका कारण बन सकती है वह है आलसी लोडिंग ट्रिगर जब कुछ क्वेरी के परिणामों पर पुनरावृत्ति।

यह आपके कनेक्शन स्ट्रिंग में MARS की अनुमति देकर आसानी से हल किया जा सकता है। MultipleActiveResultSets=trueअपने कनेक्शन स्ट्रिंग के प्रदाता भाग में जोड़ें (जहां डेटा स्रोत, प्रारंभिक कैटलॉग, आदि निर्दिष्ट हैं)।


34
इसने मेरे लिए काम किया। यदि आप एकाधिक सक्रिय परिणाम सेट (MARS) को सक्षम करने के बारे में अधिक पढ़ना चाहते हैं, तो msdn.microsoft.com/en-us/library/h32h3abf(v=vs.100).aspx देखें । MARS के नुकसान पर पढ़ने पर भी विचार करें stackoverflow.com/questions/374444/…
दिगंत कुमार

3
प्रदर्शन को ध्यान में रखते हुए आप System.Data.Entity को शामिल करके भी इसे हल कर सकते हैं और फिर इस माध्यमिक डेटा को मूल क्वेरी में लोड किया गया है यह सुनिश्चित करने के लिए विवरणों का उपयोग करें। यदि आप MARS को सक्षम करते हैं, तो इन दोहराए गए डेटा लोड की जांच करने के लिए इसे बंद करने से राउंड ट्रिप को कम करके आपके डेटा प्रोसेसिंग कॉल को गति मिल सकती है।
क्रिस मॉसचिनी

70
MARS को सक्षम करना केवल समस्याओं / उपयोग-मामलों की एक बहुत छोटी उप-श्रेणी के लिए किया जाना चाहिए। ज्यादातर मामलों में, प्रश्न में त्रुटि कॉल एप्लिकेशन के भीतर बीएडी कोड के कारण होती है। यहाँ अधिक जानकारी: devproconnections.com/development/…
माइकल के। कैंपबेल

132
जोड़ना .ToList () के बाद your.Include ()। जहाँ () की संभावना समस्या का समाधान होगा।
सेरज सगन

2
वैश्विक SQL कनेक्शन के लिए एक क्वेरी के लिए व्यापक परिवर्तन हास्यास्पद है। सही उत्तर के लिए नीचे एक टोलिस्ट होना चाहिए। एक स्थानीय समस्या के लिए एक स्थानीय निर्धारण (यानी सिर्फ क्वेरी को बदलें)!
१५

218

आप कथन ToList()से पहले विधि का उपयोग कर सकते हैं return

var accounts =
from account in context.Accounts
from guranteer in account.Gurantors

 select new AccountsReport
{
    CreditRegistryId = account.CreditRegistryId,
    AccountNumber = account.AccountNo,
    DateOpened = account.DateOpened,
};

 return accounts.AsEnumerable()
               .Select((account, index) => new AccountsReport()
                       {
                           RecordNumber = FormattedRowNumber(account, index + 1),
                           CreditRegistryId = account.CreditRegistryId,
                              DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber),
                           AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)}).OrderBy(c=>c.FormattedRecordNumber).ThenByDescending(c => c.StateChangeDate).ToList();


 public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
    {
        var dateReported = (from h in context.AccountHistory
                            where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
                            select h.LastUpdated).Max();
        return dateReported;
    }

9
मुझे यह त्रुटि अब तक कई बार मिली है ... और हर बार मैं भूल जाता हूं! प्रश्न का उत्तर हमेशा ToList () का उपयोग करना है।
चीजस टोस्ट

1
क्या इसमें कोई कमी है? यदि आपके पास 100k पंक्तियाँ हैं तो मुझे संदेह है कि यह अच्छा हो सकता है।
मार्टिन डॉसन

2
@MartinMazzaDawson, आपको क्वेरी निष्पादन पर वास्तव में 100K रिकॉर्ड की आवश्यकता है ?? मुझे लगता है कि, पेजिनेशन का उपयोग करना इस स्थिति के लिए एक अच्छा विचार है
kazem

एक पुराना विषय उठाने के लिए खेद है, लेकिन मैं एक ही त्रुटि में एक रिपॉजिटरीपैटर्न विकसित करते समय आया और मैंने इसे रिपोजिटरी के हर तरीके में ".ToList () या सिंगल () या काउंट ()" जोड़कर हल किया। जबकि शुरुआत में मैं केवल ".AsEnumerable ()" वापस कर रहा था। अब मेरा सवाल यह है कि क्या रिपॉजिटरी को "ToList ()" लौटा देना चाहिए, या यह कुछ ऐसा है जिसे अंतिम उपभोक्ता को मांगना चाहिए (अर्थात: सेवा / व्यवसाय तर्क)
alessalessio

मेरे लिये कार्य करता है। .ToList JetEntityFrameworkProvider में दशमलव समर्थन के मुद्दे को हल करता है। Total = storeDb.OF_Carts.Where(x => x.CartId == ShoppingCartId).ToList().Sum(t => t.Quantity * t.Item.UnitPrice);
हबर्ट 17

39

.ToList()दोबारा पढ़ने से बचने के लिए डीबी से पढ़ी गई वस्तु को सूची में बदलने के लिए वाक्यविन्यास का उपयोग करें । इसके लिए यह काम करेगा। धन्यवाद।


22

यहां किसी ऐसे व्यक्ति के लिए एक कार्यशील कनेक्शन स्ट्रिंग है जिसे संदर्भ की आवश्यकता है।

  <connectionStrings>
    <add name="IdentityConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\IdentityDb.mdf;Integrated Security=True;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient" />
  </connectionStrings>

15
MARS को सक्षम करना एक समाधान है, समस्या का समाधान नहीं है।
सैंडरॉक

5
MARS दस्तावेज़ पृष्ठ से: "MARS संचालन थ्रेड-सुरक्षित नहीं हैं।" इसका मतलब है, अगर समस्या कॉन्टेक्ट तक पहुंचने वाले कई थ्रेड्स से उत्पन्न होती है, तो MARS (शायद) समाधान नहीं है।
मंगल

20

मेरे मामले में, Include()इस त्रुटि को हल करना और स्थिति के आधार पर उपयोग करना बहुत अधिक कुशल हो सकता है, फिर एक साथ कई क्वेरीज़ जारी करना जब यह सब एक बार में एक साथ सम्मिलित किया जा सकता है।

IEnumerable<User> users = db.Users.Include("Projects.Tasks.Messages");

foreach (User user in users)
{
    Console.WriteLine(user.Name);
    foreach (Project project in user.Projects)
    {
        Console.WriteLine("\t"+project.Name);
        foreach (Task task in project.Tasks)
        {
            Console.WriteLine("\t\t" + task.Subject);
            foreach (Message message in task.Messages)
            {
                Console.WriteLine("\t\t\t" + message.Text);
            }
        }
    }
}

यह सबसे अच्छा समाधान है अगर आपके आवेदन अन्यथा MARS की आवश्यकता नहीं है।
फ्रेड विल्सन

7

मुझे नहीं पता कि यह डुप्लिकेट उत्तर है या नहीं। अगर यह मैं माफी चाहता हूँ। मैं सिर्फ जरूरतमंदों को यह बताना चाहता हूं कि मैंने टॉलिस्ट () का उपयोग करके अपने मुद्दे को कैसे हल किया।

मेरे मामले में मुझे नीचे क्वेरी के लिए समान अपवाद मिला।

int id = adjustmentContext.InformationRequestOrderLinks.Where(item => item.OrderNumber == irOrderLinkVO.OrderNumber && item.InformationRequestId == irOrderLinkVO.InformationRequestId).Max(item => item.Id);

मैं नीचे की तरह हल किया

List<Entities.InformationRequestOrderLink> links = adjustmentContext.InformationRequestOrderLinks
.Where(item => item.OrderNumber == irOrderLinkVO.OrderNumber && item.InformationRequestId == irOrderLinkVO.InformationRequestId).ToList();

int id = 0;

if (links.Any())
{
  id = links.Max(x => x.Id);
 }
if (id == 0)
{
//do something here
}

5

ऐसा प्रतीत होता है कि आप DateLastUpdated को एक सक्रिय क्वेरी के भीतर उसी EF संदर्भ का उपयोग करके कॉल कर रहे हैं और DateLastUpdate स्वयं डेटा स्टोर पर एक आदेश जारी करता है। एंटिटी फ्रेमवर्क केवल एक बार में प्रति संदर्भ एक सक्रिय कमांड का समर्थन करता है।

आप अपने ऊपर दिए गए दो प्रश्नों को इस तरह से एक के बाद एक कर सकते हैं:

return accounts.AsEnumerable()
        .Select((account, index) => new AccountsReport()
        {
          RecordNumber = FormattedRowNumber(account, index + 1),
          CreditRegistryId = account.CreditRegistryId,
          DateLastUpdated = (
                                                from h in context.AccountHistory 
                                                where h.CreditorRegistryId == creditorRegistryId 
                              && h.AccountNo == accountNo 
                                                select h.LastUpdated).Max(),
          AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)
        })
        .OrderBy(c=>c.FormattedRecordNumber)
        .ThenByDescending(c => c.StateChangeDate);

मैंने यह भी देखा कि आप प्रश्नों में FormattedAccountNumber और FormattedRecordNumber जैसे कार्य कर रहे हैं। जब तक ये आपके डेटाबेस से निकाले गए प्रॉपर या फ़ंक्शंस को इकाई डेटा मॉडल में संग्रहीत और सही मैप नहीं किए जाते हैं, तब तक ये एक्सेप्ट भी फेंक देंगे क्योंकि ईएफ को पता नहीं होगा कि उन फ़ंक्शन को स्टेटमेंट में कैसे ट्रांसलेट किया जाए जो यह डेटा स्टोर को भेज सकता है।

यह भी ध्यान दें, AsEnumerable को कॉल करना क्वेरी को निष्पादित करने के लिए बाध्य नहीं करता है। जब तक क्वेरी का निष्पादन enumerated तक स्थगित है। आप इच्छा होने पर ToList या ToArray के साथ गणना कर सकते हैं।


यदि आप चाहते हैं कि आप अपने द्वारा चुनी गई रिपोर्ट में DateLastUpdated निर्देश प्राप्त करने के लिए प्रदर्शन कर रहे क्वेरी को रीफ़्रैक्टर कर सकते हैं और खाता रिपोर्ट क्वेरी के लिए वांछित प्रभाव प्राप्त कर सकते हैं।
जेम्स अलेक्जेंडर

मुख्य क्वेरी के अंदर फ़ंक्शन का कोड डालने के बाद मुझे एक ही त्रुटि मिल रही है
DotnetSparrow

2

लद्दिस्लाव मृका के जवाब के अलावा :

यदि आप सेटिंग टैब पर कंटेनर को प्रकाशित और अधिलेखित कर रहे हैं , तो आप True पर एकाधिकActiveResultSet सेट कर सकते हैं । आप इस विकल्प को उन्नत पर क्लिक करके पा सकते हैं ... और यह उन्नत समूह के अंतर्गत आने वाला है ।


2

Google के माध्यम से इसे खोजने वालों के लिए;
मुझे यह त्रुटि मिल रही थी, क्योंकि त्रुटि के अनुसार, मैं एक SqlDataReader को बंद करने में विफल रहा, उसी SqlCommand पर एक और बनाने से पहले, गलती से यह मान लिया गया था कि यह जिस विधि से बनाया गया था, उसे छोड़ते समय यह कचरा एकत्रित हो जाएगा।

मैंने sqlDataReader.Close();दूसरा रीडर बनाने से पहले कॉल करके समस्या हल की ।


2

मेरे मामले में, मैंने डेटा संदर्भ से एक क्वेरी खोली थी, जैसे

    Dim stores = DataContext.Stores _
        .Where(Function(d) filter.Contains(d.code)) _

... और फिर बाद में उसी की पुष्टि की ...

    Dim stores = DataContext.Stores _
        .Where(Function(d) filter.Contains(d.code)).ToList

.ToListपहले मुद्दे को जोड़कर मेरे मुद्दे को हल किया। मुझे लगता है कि यह इस तरह की संपत्ति में लपेटने के लिए समझ में आता है:

Public ReadOnly Property Stores As List(Of Store)
    Get
        If _stores Is Nothing Then
            _stores = DataContext.Stores _
                .Where(Function(d) Filters.Contains(d.code)).ToList
        End If
        Return _stores
    End Get
End Property

जहाँ _stores एक निजी वैरिएबल है, और फ़िल्टर भी एक आसानी से संपत्ति है जो AppSettings से पढ़ता है।


1

मेरे पास एक ही त्रुटि थी, जब मैंने रीड लूप के भीतर कुछ रिकॉर्ड अपडेट करने की कोशिश की। मैंने सबसे अधिक वोट किए गए उत्तर की कोशिश की है MultipleActiveResultSets=trueऔर पाया है, कि यह अगली त्रुटि पाने के लिए केवल समाधान है 

नए लेनदेन की अनुमति नहीं है क्योंकि सत्र में अन्य थ्रेड चल रहे हैं

सबसे अच्छा तरीका, जो कि विशाल परिणाम के लिए काम करेगा, प्रत्येक चौके के लिए अलग-अलग संदर्भों को खोलना और अलग-अलग संदर्भों का उपयोग करना है जैसा कि एंटिटी फ्रेमवर्क से SqlException में वर्णित है  - नए लेनदेन की अनुमति नहीं है क्योंकि सत्र में चलने वाले अन्य धागे हैं


1

मैंने प्रतीक्षित _accountSessionDataModel.SaveChangesAsync () बदलकर इस समस्या को हल किया; से _accountSessionDataModel.SaveChanges (); मेरे रिपॉजिटरी वर्ग में।

 public async Task<Session> CreateSession()
    {
        var session = new Session();

        _accountSessionDataModel.Sessions.Add(session);
        await _accountSessionDataModel.SaveChangesAsync();
     }

इसे बदल दिया गया:

 public Session CreateSession()
    {
        var session = new Session();

        _accountSessionDataModel.Sessions.Add(session);
        _accountSessionDataModel.SaveChanges();
     }

समस्या यह थी कि मैंने सत्र (कोड में) बनाने के बाद फ्रंटेंड में सत्रों को अपडेट किया, लेकिन क्योंकि SaveChangesAsync असिंक्रोनस रूप से होता है, सत्रों को लाने से यह त्रुटि हुई क्योंकि स्पष्ट रूप से SaveChangesAsync ऑपरेशन अभी तक तैयार नहीं था।


1

वैसे मेरे लिए यह अपना बग था। मैं एक INSERTप्रयोग चलाने की कोशिश कर रहा था SqlCommand.executeReader()जब मुझे उपयोग करना चाहिए था SqlCommand.ExecuteNonQuery()। इसे खोला गया और कभी बंद नहीं किया गया, जिससे त्रुटि हुई। इस निरीक्षण के लिए बाहर देखो।


यह मेरी तरफ से एक ही मुद्दा था। मुझे SqlCommand.executeReader () की आवश्यकता थी क्योंकि मुझे सम्मिलित पंक्तियाँ ID मिल रही हैं। तो: मैंने SqlDataReader.Close () का उपयोग किया; Sql Command.Dispose (); धन्यवाद @Andrew टेलर
Fuat

1

इसे वास्तविक विश्व परिदृश्य से निकाला गया है:

  • एकाधिक स्टेज के साथ एक स्टेज के माहौल में कोड अच्छी तरह से काम करता है। कनेक्शन स्ट्रिंग में सेट किया गया है
  • MultiActiveResultSets = true के बिना उत्पादन वातावरण में प्रकाशित कोड
  • इतने सारे पृष्ठ / कॉल कार्य करते हैं जबकि एक भी विफल हो रहा है
  • कॉल को नज़दीक से देखने पर, db पर एक अनावश्यक कॉल आता है और उसे हटाने की आवश्यकता होती है
  • सेट करें MultipleActiveResultSets = प्रोडक्शन में सच है और क्लीन अप कोड प्रकाशित करें, सब कुछ अच्छी तरह से और कुशलता से काम करता है

अंत में, MultipleActiveResultSets के बारे में भूलने के बिना, कोड एक अनावश्यक डब कॉल की खोज करने से पहले एक लंबे समय के लिए चल सकता है जो बहुत महंगा हो सकता है, और मैं सुझाव देता हूं कि वह पूरी तरह से कईActiveSultSets विशेषता सेट करने पर निर्भर न हों, लेकिन यह भी पता करें कि कोड को इसकी आवश्यकता क्यों है। यह कहाँ असफल रहा


1

सबसे अधिक संभावना यह मुद्दा इकाई फ्रेमवर्क की "आलसी लोडिंग" सुविधा के कारण होता है। आमतौर पर, जब तक प्रारंभिक भ्रूण की स्पष्ट रूप से आवश्यकता नहीं होती है, तब तक सभी डेटा (कुछ भी जो अन्य डेटाबेस तालिकाओं में संग्रहीत होता है) को केवल आवश्यक होने पर ही प्राप्त किया जाता है। कई मामलों में यह एक अच्छी बात है, क्योंकि यह अनावश्यक डेटा लाने से रोकता है और इस तरह क्वेरी प्रदर्शन (कोई जुड़ाव नहीं) को बेहतर बनाता है और बैंडविड्थ बचाता है।

प्रश्न में वर्णित स्थिति में, प्रारंभिक भ्रूण का प्रदर्शन किया जाता है, और "चयन" चरण के दौरान लापता आलसी लोडिंग डेटा का अनुरोध किया जाता है, अतिरिक्त प्रश्न जारी किए जाते हैं और फिर ईएफ को "ओपन डेटारीडर" के बारे में शिकायत होती है।

स्वीकृत उत्तर में प्रस्तावित वर्कअराउंड इन प्रश्नों के निष्पादन की अनुमति देगा, और वास्तव में संपूर्ण अनुरोध सफल होगा।

हालाँकि, यदि आप डेटाबेस को भेजे गए अनुरोधों की जांच करेंगे, तो आप कई अनुरोधों को नोटिस करेंगे - प्रत्येक लापता (आलसी लोड) डेटा के लिए अतिरिक्त अनुरोध। यह एक प्रदर्शन हत्यारा हो सकता है।

प्रारंभिक दृष्टिकोण के दौरान सभी आवश्यक आलसी लोड किए गए डेटा को लोड करने के लिए ईएफ को बताने के लिए एक बेहतर तरीका है। यह "शामिल करें" कथन का उपयोग करके किया जा सकता है:

using System.Data.Entity;

query = query.Include(a => a.LazyLoadedProperty);

इस तरह, सभी आवश्यक जोड़ प्रदर्शन किए जाएंगे और सभी आवश्यक डेटा एक ही क्वेरी के रूप में वापस आ जाएंगे। प्रश्न में वर्णित समस्या हल हो जाएगी।


यह एक मान्य उत्तर है, क्योंकि मैं EntityEntry.Collection () लोड () का उपयोग कर शामिल करने से गया था, और मेरा समाधान काम करने से टूट गया। दुर्भाग्य से, एक जेनेरिक के लिए शामिल नहीं कर सकते हैं फिर "InInclude" एक और जेनेरिक, इसलिए मैं अभी भी EntityEntry.Collection () लोड करने की कोशिश कर रहा हूं।
एंड्रयूजामिन 21

0

मैं अपने टूल में वेब सेवा का उपयोग कर रहा हूं, जहां वे सेवा संग्रहीत प्रक्रिया को लाती हैं। जबकि क्लाइंट टूल की अधिक संख्या वेब सेवा प्राप्त करती है, यह समस्या उत्पन्न होती है। मैंने उन फ़ंक्शन के लिए सिंक्रनाइज़ किए गए विशेषता को निर्दिष्ट करके निर्धारित किया है जो संग्रहीत प्रक्रिया को प्राप्त करते हैं। अब यह ठीक काम कर रहा है, मेरे टूल में त्रुटि कभी नहीं दिखाई दी।

 [MethodImpl(MethodImplOptions.Synchronized)]
 public static List<t> MyDBFunction(string parameter1)
  {
  }

यह विशेषता एक समय में एक अनुरोध को संसाधित करने की अनुमति देती है। इसलिए यह समस्या हल करता है।


0

साइड-नोट के रूप में ... यह तब भी हो सकता है जब SQL ऑब्जेक्ट्स से (आंतरिक) डेटा-मैपिंग में कोई समस्या हो।

उदाहरण के लिए...

मैंने बनाया SQL Scalar Functionकि एक गलती से लौट आया VARCHAR... और फिर ... एक कॉलम में एक कॉलम बनाने के लिए इसका इस्तेमाल किया VIEWVIEWसही ढंग से में मैप किया गया था DbContext... इसलिए Linq तब भी वह अच्छे बुला रहा था। हालाँकि, इकाई को डेटटाइम की उम्मीद थी ? और स्ट्रिंगVIEW लौट रहा था ।

जो ODDLY फेंकता है ...

"पहले से ही एक खुला DataReader इस कमांड से जुड़ा है जिसे पहले बंद किया जाना चाहिए"

यह पता लगाना कठिन था ... लेकिन जब मैंने वापसी के मापदंडों को ठीक किया ... तब तक सब ठीक था


0

मेरे मामले में, मैं स्थापित करने के लिए किया था MultipleActiveResultSetsके लिए Trueकनेक्शन स्ट्रिंग में।
तब यह एक ही डेटा संदर्भ में एक ही समय में 2 (SQL) कमांड चलाने में सक्षम नहीं होने के बारे में एक और त्रुटि (वास्तविक एक) दिखाई दी! (ईएफ कोर, कोड पहले)
तो मेरे लिए समाधान किसी अन्य अतुल्यकालिक कमांड निष्पादन की तलाश करना और उन्हें तुल्यकालिक में बदलना था, क्योंकि मेरे पास दोनों आदेशों के लिए सिर्फ एक DbContext था।

मुझे उम्मीद है इससे आपको मदद मिली होगी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.