2009-09-16 13 views
5

मैं अपने एमएसएसएलएल 2008 एक्सप्रेस सर्वर तक पहुंचने के लिए एल 2 एस का उपयोग कर रहा हूं। मैं जानना चाहता हूं कि डेटाकॉन्टेक्स्ट डीबी से कनेक्शन कब खुलता है? और क्या इसे खोले जाने के बाद कनेक्शन बंद हो जाएगा?डेटाकॉन्टेक्स्ट डीबी से कनेक्शन कब खुलता है?

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

var dc = new TestDB(); // connection opened and closed? 

dc.SomeTable.InsertOnSubmit(obj); // connection opened and closed? 

foreach(var obj in dc.SomeTable.AsEnumerable()) // connection opened and closed? 
{ 
    ... // connection opened and closed? 
} 

dc.SubmitChanges();  // connection opened and closed? 
+0

कोई एल 2 एस समर्थक नहीं है, लेकिन मुझे उम्मीद है कि यह केवल सबमिटChanges() में खुल जाएगा और बंद होगा। – mxmissile

उत्तर

2

एक कनेक्शन तब बनाया जाता है जब आप वास्तव में गणना करना शुरू करते हैं और जब आप सबमिटChanges (यदि परिवर्तन किए जाते हैं) को दबाते हैं। मुझे यकीन नहीं है कि उपरोक्त कोड में केवल एक कनेक्शन खोला गया है और उपयोग किया गया है, लेकिन मुझे पता है कि उन दो स्थानों में मैंने बताया है, आप एक कनेक्शन का आह्वान करेंगे।

आपको LinqPad और how to use it पर dimecasts पर देखना शुरू करना होगा। इसके अलावा पर Delayed Execution features of Linq 2 Sql

नोट उनके श्रृंखला की जाँच, कुछ इस तरह (getTenSomethingElse (रों, रों, रों)) डाटाबेस क्वेरी नहीं है, कम से कम जब तक नहीं आप वापसी मान से अधिक की गणना शुरू

partial class MyDataContext 
{ 
    // builds the tree to pull data from the db that matches a criteriea and pass it a ctor of another class 
    public System.Linq.IQueryable<SomethingElse> getSomethingElse(string searchTerm, string searchValue, string orderBy) 
    { 
     var items = 
      from s in 
      this.Somethings 
      select new SomethingElse(s); 

     return items.Where(searchTerm, searchValue).OrderBy(orderBy); 
    } 

    // calls the above method but adds take 10 to that tree 
    public System.Linq.IQueryable<SomethingElse> getTenSomethingElse(string searchTerm, string searchValue, string orderBy) 
    { 
     var items = 
      from s in 
      this.getSomethingElse(searchTerm, searchValue, orderBy) 
      select s; 

     return items.Take(10); 
    } 
} 

आपके बारे में आईडीके लेकिन मुझे लगता है कि किए जा रहे सभी कार्यों पर विचार करने के लिए काफी भयानक होना चाहिए।

ओह btw, कि "कहाँ (रों, रों)" विस्तार के बारे में अधिक जानकारी के लिए एसक्यूएल पर ScottGu's awesome blog

+0

आपने 'System.Linq.IQueryable' फ़ंक्शन के संबंध में एक बहुत अच्छा बिंदु उठाया। धन्यवाद, इससे मदद मिली। –

0

एसक्यूएल internals के लिए LINQ के बारे में पता नहीं है, लेकिन सामान्य ज्ञान कहता है कि डेटाबेस कनेक्शन संभव समय के कम से कम राशि खोला जाना चाहिए, तो यह उम्मीद करना कि SubmitChanges खोलता उचित है कनेक्शन, इसके काम करता है, और फिर कनेक्शन बंद कर देता है।

ध्यान दें कि आप DataContext द्वारा उपयोग की गई डीबीकनेक्शन ऑब्जेक्ट तक पहुंच सकते हैं। हो सकता है कि यदि आप हाथ से कनेक्शन खोलते हैं, तो DataContext इसे सबमिट करने के बाद इसे बंद नहीं करेगा (बस अनुमान लगाया, कभी कोशिश नहीं की)।

2

LINQ पाया जा सकता है आप के लिए अच्छा है: यह खोलने के लिए और SubmitChanges में डेटाबेस कनेक्शन बंद हो जाएगा()।

इसके अलावा, यदि आप एक से अधिक रिकॉर्ड डालते हैं, तो आवेषण एक ही लेनदेन में निहित होगा, इसलिए वे सभी सफल होंगे या वे सभी असफल हो जाएंगे।

foreach(var obj in dc.SomeTable.AsEnumerable()) के मामले में, एक डेटाबेस कनेक्शन खोला और बंद किया गया है - बस एक बार, जिसके दौरान सभी रिकॉर्ड पुनर्प्राप्त किए जाते हैं।

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