2008-10-10 10 views
10

मेरे पास एक टेबल है, हम Users पर कॉल करेंगे। इस तालिका में SQL सर्वर में परिभाषित एक प्राथमिक कुंजी है - एक autoincrement int IDअजीब LINQ अपवाद (सीमाओं से बाहर सूचकांक)

कभी-कभी, इस तालिका के विरुद्ध मेरी LINQ क्वेरी "Index was outside the range" त्रुटि के साथ विफल होती है - यहां तक ​​कि सबसे सरल प्रश्न भी। क्वेरी स्वयं किसी भी इंडेक्सर्स का उपयोग नहीं करती है।

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

User = Users.Take(1); 

या

IEnumerable<Users> = Users.ToList(); 

प्रश्नों के दोनों एक ही त्रुटि फेंक दिया। उत्पन्न क्वेरी को देखने के लिए डीबगर विजुअलाइज़र का उपयोग करना - मैं SQL में क्वेरी कॉपी और पेस्ट करता हूं और यह ठीक काम करता है। मैं विजुअलाइज़र पर "निष्पादित" पर भी क्लिक करता हूं और यह ठीक काम करता है। लेकिन कोड को निष्पादित करने से यह त्रुटि फेंकता है। मैं कक्षा में किसी भी आंशिक तरीकों को लागू नहीं करता, इसलिए वहां कुछ भी नहीं हो रहा है। अगर मैं अपने डीबगर को पुनरारंभ करता हूं, तो समस्या दूर हो जाती है, कुछ घंटों बाद यादृच्छिक रूप से फिर से इसके सिर को पीछे छोड़ने के लिए। अधिक गंभीर रूप से, मैं इस बग को उत्पादन में चल रहे ऐप से अपने त्रुटि लॉग में देखता हूं।

मैं अपने ऐप में LINQ का एक टन करता हूं, मेरे डेटाबेस में एक दर्जन या उससे अलग इकाइयों के खिलाफ, लेकिन मुझे केवल मेरी तालिका में किसी विशिष्ट इकाई से संबंधित प्रश्नों पर यह समस्या दिखाई देती है। कुछ googling ने सुझाव दिया है कि यह समस्या मेरे मॉडल और किसी अन्य इकाई के बीच निर्दिष्ट गलत रिश्ते से संबंधित हो सकती है, लेकिन मेरे पास इस ऑब्जेक्ट के साथ कोई संबंध नहीं है। ऐसा लगता है कि यह 9 5% काम कर रहा है, यह सिर्फ 5% असफल है।

मैंने डिजाइनर से पूरी तरह से वस्तु को हटा दिया है, और इसे "ताज़ा" सर्वर ब्राउज़र से फिर से जोड़ा है, और इससे समस्या ठीक नहीं हुई है।

कोई विचार क्या हो रहा है?

यहाँ पूर्ण त्रुटि संदेश और स्टैक ट्रेस है:

सूचकांक सीमा से बाहर किया गया था। गैर-नकारात्मक और संग्रह के आकार से कम होना चाहिए। पैरामीटर नाम: System.Data.Linq.SqlClient.SqlProvider.Execute में सूचकांक (अभिव्यक्ति क्वेरी, QueryInfo queryInfo, IObjectReaderFactory कारखाने, वस्तु [] parentArgs, वस्तु [] userArgs, ICompiledSubQuery [] सबक्वेरी, वस्तु LASTRESULT कुल) पर System.Data.Linq.SqlClient.SqlProvider.ExecuteAll System.Data.Linq.SqlClient.SqlProvider.System.Data पर (अभिव्यक्ति क्वेरी, QueryInfo [] queryInfos, IObjectReaderFactory कारखाने, [] userArguments, ICompiledSubQuery [] सबक्वेरी वस्तु) Linq.Provider.IProvider.Execute (अभिव्यक्ति क्वेरी) सिस्टम.डाटा.लिंक.टेबल 1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable 1 स्रोत, अभिव्यक्ति`1 अनुमान) MyProject.FindUserByType (स्ट्रिंग प्रकार आईडी) पर

संपादित करें: जैसा कि अनुरोध किया गया है, नीचे तालिका स्कीमा की एक प्रति है।

CREATE TABLE [dbo].[Container](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[MarketCode] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
[Description] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
[Capacity] [int] NOT NULL, 
[Volume] [float] NOT NULL 
CONSTRAINT [PK_Container] PRIMARY KEY CLUSTERED 
(
[ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

संपादित करें: स्टैक ट्रेस FirstOrDefault से पता चलता है, लेकिन मैं Take() और ToList() दोनों का उपयोग कर त्रुटि दोहराया। स्टैक ट्रेस इन सभी के बीच समान है, बस FirstOrDefault/Take/ToList interchangnig interchangnig। स्टैक को SqlProvider.Execute पर ले जाना वास्तव में समान है।

+0

क्या हो रहा है पर कोई विचार नहीं, लेकिन आकर्षक! यदि सब कुछ विफल हो जाता है, तो आप सामान्य लिंक परियोजना सूची को आजमा सकते हैं: http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=123&SiteID=1 –

+0

यदि हम तालिका परिभाषा देख सकते हैं तो यह मदद कर सकता है। – KyleLanser

+0

(mssql -> डेटाबेस -> the_db -> टेबल्स -> the_bad_table -> दायाँ क्लिक करें -> स्क्रिप्ट तालिका के रूप में -> बनाएं) – KyleLanser

उत्तर

0

अपवाद सिस्टम सिस्टम लाइब्रेरी में होता है और आपकी कहानी मुझे लगता है कि समस्या आपके कोड में नहीं है। क्या हाल ही में स्कीमा बदल गया है? क्या आपका मानचित्रण सही है?

+0

स्कीमा हाल ही में नहीं बदला है, हालांकि मुझे काफी समय से समस्या होनी पड़ी है। मैंने अपराधी तालिका को हटा दिया और सर्वर ब्राउज़र के माध्यम से इसे फिर से जोड़ा, इसका कोई फायदा नहीं हुआ। – Matt

1

मैं कहूंगा कि आपके पास एक मॉडल -> डेटाबेस मिस्चैच कहीं है। जब मैं इस तरह की परिस्थितियों में आपको उतना ही हताश हो जाता हूं, तो मैं आमतौर पर वीएस.NET को आग लगाता हूं, एक नया कंसोल ऐप बनाता हूं, और डीबीएमएल के अनुभाग का पुनर्निर्माण करता हूं जो इस क्वेरी में रुचि की इकाई का संदर्भ देता है, और फिर से चलाता है। आप पाते हैं कि इस तरह के अलगाव में, क्वेरी काम करता है। क्या आपने आंशिक तरीकों को भरकर अपनी किसी भी इकाई परिभाषा को कस्टमाइज़ किया है, खासकर जो सृजन पर आग लगते हैं? अंधेरे में

-1

शॉट:

आप एक पाश शरीर के अंदर MyProject.FindUserByType (स्ट्रिंग typeId) बुला पैरामीटर के रूप में पाश चर का उपयोग कर रहे हैं।

लूप वैरिएबल का सीधे उपयोग न करें।

foreach(string s in myTypeList) 
{ 
    //GetUserByType(s); //Ooo, bad 
    string tempstring = s; 
    GetUserByType(tempstring); 
} 

इस निकलती है तो मामला है, मैं समझाने के लिए क्यों पाश वेरिएबल का उपयोग करके सीधे एक बुरा व्यवहार (आप सवाल अद्यतन करने के बाद पाश को दिखाने के लिए) है इस उत्तर अद्यतन करेगा।

+0

यहां पर जहां मैंने इंडेक्स को सीमा से बाहर किया है और LINQ से SQL को http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3782912&SiteID=1 –

+0

हाय डेविड से पहले देखा है। मैं वास्तव में, किसी भी लूपिंग नहीं कर रहा हूँ। मुझे लगता है कि आप किस बात का जिक्र कर रहे हैं यह है कि क्वेरी के स्थगित निष्पादन के परिणामस्वरूप मूल रूप से इरादे से भिन्न मूल्य का उपयोग किया जा सकता है, क्योंकि यह लूपिंग के दौरान बदल गया है। हालांकि यह एक दिलचस्प बात है, क्योंकि यह मेरे लिए नहीं हुआ था। – Matt

5

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

यदि आपको यह त्रुटि मिल रही है और आपने अपने पीओसीओ पर ऑनक्रेटेड या ऑनलोडेड विधियों को पेश किया है, तो उन तरीकों से कदम उठाने का प्रयास करें।

+0

दरअसल, यह एक और प्रकार का अपवाद है जो इस "सीमा से बाहर" से छिपा हुआ है। मेरे मामले में मुझे एक ही समस्या थी और यह था कि जिस वस्तु को मैं संशोधित करना चाहता था वह एक गैर-मान्य संदर्भ में था। – Hannish

0

यह समस्या linq ऑब्जेक्ट और उस तालिका के डेटाबेस फ़ील्ड के कारण होती है समान नहीं है।

0

मुझे यह समस्या भी थी और इसे हल किया गया।

अब मुझे समझ में आता है कि त्रुटि लिंक डेटा संदर्भ का गलत उपयोग था, लेकिन हो सकता है कि मेरा अनुभव अभी भी दूसरों को यह समझने में सहायता कर सके कि उन्हें यह त्रुटि क्यों मिलती है।

लिंक डेटा संदर्भ एक साथ चलने के लिए नहीं है। इसलिए एसिंक चलाने वाले कई कार्यों को आदर्श बनाना आदर्श नहीं है। निम्न नमूना कोड का निरीक्षण मुद्दे को समझने के:

using(var ctx = new LinqDataContext()) 
{ 
    List<Task> tasks = new List<Task>(); 
    for(int i=0;i<1000;i++) 
    { 
     var task = Task.Run(() => { 
      var customer = ctx.Customers.SingleOrDefault(o => o.Id == i); 
      customer.DoSomething(); 
     } 
     tasks.Add(task); 
    } 
    Task.WaitAll(tasks); 
} 

मेरी परिदृश्य में, मैं एक लंबे समय तक कॉल स्टैक में पैरामीटर के रूप डेटा संदर्भ गुजर रहा था, और रास्ते में async तरीकों बुला। तो यह उपरोक्त उदाहरण के रूप में स्पष्ट नहीं था। लेकिन शायद यह किसी और की मदद कर सकता है :-)