2009-05-10 26 views
26

में पैरामीटर की अधिकतम संख्या कुछ समय से मैं LINQ के साथ प्रयोग करता हूं। विशिष्ट विधि एक संग्रह के माध्यम से गणना और बदल मेरी कोड में उसके गुण से कुछ विचार करेंगे की तरह करने के लिए:एसक्यूएल क्वेरी

ATDataContext dc = new ATDataContext(Settings.connection_string); 

int[] col = ListViewClass.getListViewSelectedPositionTags(listView); 

try 
{ 
    foreach (var item in col) 
    { 
     var ctx = (from r in dc.MailingLists 
        where r.ID == item 
        select r).Single(); 

     ctx.Excluded = 'Y'; 
     ctx.ExcludedComments = reason; 
    } 

    dc.SubmitChanges(); 
} 

कुछ समय एक से यह करने के लिए एक सलाह मिल गया है ... बहुत समझदारी भरा तरीका है की तरह लगता है:

var ctx = from r in dc.MailingLists 
    where col.Contains(r.ID) 
    select r; 

foreach (var item in ctx) 
{ 
    item.Excluded = 'Y'; 
    item.ExcludedComments = reason; 
} 

dc.SubmitChanges(); 

आईट इतने सारे स्तरों पर समझ में आता है और मुझे यह समाधान पसंद है। यह पहले की तुलना में स्मार्ट और तेज है।

मैंने कुछ समय के लिए इस समाधान का उत्पादन वातावरण में उपयोग किया है।

क्या था कुछ ही हफ्तों के बाद मेरे आश्चर्य जब एक आवेदन लॉग फाइल खोज और देखते हैं कि यह:

"भेजे तालिका डेटा स्ट्रीम (टीडीएस) दूरस्थ प्रक्रिया कॉल (RPC) प्रोटोकॉल धारा गलत है बहुत सारे पैरामीटर। इस आरसीपी अनुरोध में प्रदान किए गए थे। अधिकतम 2100 है। "

LINQ एसक्यूएल में धर्मान्तरित where col.Contains(r.ID)IN खंड की तरह कुछ के लिए देख रहे हैं:
कहां में आईडी (@ p1, @ p1, @ p2 ...)

से col संग्रह पर पहुंच गया (मेरे मामले में) और अधिक 2100 तत्व और क्वेरी निष्पादित करने में विफल रही। मैं इस समस्या पर कुछ शोध किया है और क्या मैं समाप्त हो गया है:

"... एसक्यूएल क्वेरी में पैरामीटर की अधिकतम संख्या 2100 अधिक सीमाओं नहीं है, तथ्य यह है कि पूरे क्वेरी स्ट्रिंग लंबा नहीं हो सकता की तरह है 8044 वर्णों से। "

मुझे दूसरा समाधान इतना पसंद आया है। मैं SQL सर्वर की इन हार्ड-कोडित सीमाओं से बहुत निराश हूं।

क्या मुझे कुछ याद आया? क्या "मैं col.Contains (r.ID)" संस्करण का उपयोग करने में सक्षम होने के लिए कुछ भी कर सकता हूं?

सादर मारिउज़

ps। (मैं LINQ और SQL 2005 एक्सप्रेस के साथ विन XP, C# का उपयोग करता हूं)।

+0

क्षमाप्रार्थी। मैं कोड नमूने प्रारूपित करने के लिए प्रबंधन नहीं किया था। अगर कोई मदद कर सकता है तो मैं बहुत सराहना करता हूं ... – Mariusz

+0

स्वरूपित; आप संपादक में ऐसा करने के लिए "कोड" और "उद्धरण" बटन का उपयोग कर सकते हैं। –

+0

आपको बहुत बहुत धन्यवाद। बस अपने दूसरे जवाब के माध्यम से खुदाई। ऐसा लगता है कि यह केक का आसान टुकड़ा नहीं होगा :-) – Mariusz

उत्तर

39

सीमा are hard-coded:

संग्रहीत प्रक्रिया के अनुसार
  • पैरामीटर 2,100
  • प्रति उपयोगकर्ता परिभाषित समारोह 2.100

पैरामीटर मैं बैच में Contains क्वेरी कि विभाजन से पहले कुछ कोड लिखा था और संयुक्त परिणाम ... see here for more

+5

त्रुटि संदेश/दस्तावेज़ीकरण गलत है।उनके पास एक चेक होना चाहिए जो 2100 के बजाय '> = 2100' हो क्योंकि वास्तविक सीमा 2099 है, इसे 4 पैरामीटर बैच भेजने की कोशिश करने के साथ ही देखा गया है, जो 525 –

+1

@JonnyLeeds को भी दिलचस्प बनाता है; मुझे आश्चर्य है कि ऐसा कुछ ऐसा करता है जैसे हमेशा वापसी मूल्य के लिए स्थान शामिल होता है (भले ही उपयोग नहीं किया जाता है), जिसे संभवतः पैरामीटर –

+0

पैरामीटर के रूप में लागू किया गया है। वहां प्रलेखन केवल विशेष रूप से कार्यों और संग्रहीत प्रक्रियाओं का उल्लेख करता है, जबकि मैं केवल आवेषण का एक बड़ा सेट चला रहा था, हालांकि 'आदेश' निष्पादित करने के अपवाद। [ब्लेह] निष्पादित करें (सी # में) 2100 का भी उल्लेख है –

संबंधित मुद्दे