2009-09-27 11 views
6

मैं ADO.Net + C# + VSTS 2008 + ADO.Net का उपयोग कर रहा एसक्यूएल सर्वर 2008 उद्यम से कनेक्ट करने के। मैं यहां एक ही पैटर्न/नमूना का उपयोग कर रहा हूं - एक प्रविष्टि (पंक्ति) द्वारा डेटा एक प्रविष्टि (पंक्ति) को पुनर्प्राप्त करने के लिए ADO.Net DataReader का उपयोग कर रहा हूं।ADO.Net DataReader टाइमआउट मुद्दा

http://msdn.microsoft.com/en-us/library/haa3afyz.aspx

मेरा प्रश्न है, अगर मैं इस नमूने में SqlCommand समाप्ति सेट, 1. मुझे लगता है कि समय समाप्ति हम अधिकतम मान के रूप इस्तेमाल कर सकते हैं कितना समय एक specifc पंक्ति को पुनः प्राप्त करने के लिए लागू होता है, न कि कुल पूरे डेटा एंट्री-बाय-एंट्री लूप के लिए टाइमआउट?

Btw: पाश मेरा मतलब है,

while (reader.Read()) 
{ 
    Console.WriteLine("{0}\t{1}", reader.GetInt32(0), 
     reader.GetString(1)); 
} 

2. और इस समय समाप्ति केवल मायने रखती है कि कितना समय यह डेटाबेस से डेटा प्रविष्टि को पुनः प्राप्त करने देता है और इस समय समाप्ति कितना समय हम सौदा के साथ कोई संबंध नहीं है प्रत्येक प्रविष्टि के साथ (उदाहरण के लिए यदि हम 20 सेकंड तक टाइमआउट सेट करते हैं, और यदि डेटाबेस से एक डेटा एंट्री पुनर्प्राप्त करने में 1 सेकंड लगते हैं, और मेरे एप्लिकेशन लॉजिक के लिए डेटा प्रविष्टि में हेरफेर करने में 30 सेकंड लगते हैं, तो टाइमआउट कभी नहीं होगा)।

सही समझ?

उत्तर

10

आदेश टाइमआउट आप सेट कर सकते हैं कि आप कितने समय तक अपना काम करने में ADO.NET देने के लिए लागू होता है पर अमल करने की जरूरत है।

आप cmdQuery.ExecuteNonQuery() जो कुछ भी नहीं देता है लेकिन एक एसक्यूएल बयान यह समय है कि बयान करने की जरूरत है प्रदर्शन को कॉल करते हैं।

यदि आप cmdQuery.ExecuteReader() पर कॉल करते हैं जो डेटा रीडर देता है, तो उस डेटा रीडर को स्टी/अप करने के लिए ADO.NET के लिए आवश्यक समय है ताकि आप इसका उपयोग कर सकें।

यदि आप cmdQuery.ExecuteScalar() पर कॉल करते हैं जो एक एकल स्केलर मान देता है, तो यह क्वेरी निष्पादित करने और उस एकल परिणाम को पकड़ने के लिए आवश्यक समय है।

यदि आप डेटा तालिका या डेटा सेट भरने के लिए dataAdapter.Fill() का उपयोग करते हैं, तो डेटा को पुनर्प्राप्त करने के लिए ADO.NET के लिए आवश्यक समय है और फिर डेटा तालिका या डेटा सेट भरें।

तो समग्र: टाइमआउट नौकरी कि ADO.NET कर सकते हैं भाग पर लागू होती - बयान निष्पादित, किसी डेटा सेट को भरने, एक अदिश मान।

बेशक यह नहीं (एक डेटा पाठक के मामले में) समय यह आप परिणामों के माध्यम से पुनरावृति करने के लिए ले जाता है के लिए लागू होता है। यही कारण है कि सब पर कोई मतलब नहीं होगा ...

मार्क

+0

धन्यवाद मार्क, 1. क्या डेटाटाइडर के परिदृश्य के लिए आपका मतलब है, जब मुझे डेटा रीडर उदाहरण प्राप्त होता है, तो टाइमआउट कोई प्रभाव नहीं लेगा? 2. यदि हां, तो मेरा भ्रम है, मैंने डेटारिएडर के लिए पहले कुछ दस्तावेज़ पढ़े हैं, ADO.Net स्ट्रीमिंग फेशन में डेटा पुनर्प्राप्त करता है, यानी डेटारिएडर बनने पर SQL सर्वर से सभी डेटा पुनर्प्राप्त नहीं किए जाते हैं। यदि यह सत्य है, तो ADO.Net क्लाइंट और SQL सर्वर सर्वर पक्ष के बीच और अधिक स्थानांतरण होना चाहिए?लेकिन जैसा कि आपने कहा था कि डेटाराइडर के निर्माण के बाद टाइमआउट अब और प्रभावित नहीं होता है, इसलिए आगे स्ट्रीमिंग स्थानांतरण के लिए कोई टाइमआउट नियंत्रण नहीं है? – George2

+0

मेरी उपरोक्त टिप्पणियों के लिए मेरी चिंता यह है कि, क्लाइंट डेटारेडर को बहुत लंबे समय तक पकड़ेंगे, और मुझे लगता है कि स्ट्रीमिंग मोड में (क्योंकि एडीओ.Net भविष्यवाणी नहीं कर सकता कि क्लाइंट अधिक डेटा पढ़ना चाहता है या सिर्फ पाठक लूप को तोड़ना चाहता है), कनेक्शन हर समय जिंदा रखा जाएगा। मैं ऐसे व्यवहार के लिए टाइमआउट नियंत्रण रखना चाहता हूं जो एडीओ.Net से कनेक्शन को बंद/रिलीज़ करने के लिए ऐसे लंबे लाइव रीडर को मजबूर करता है। कोई भी SqlCommand (DataReader बनाने के लिए प्रयुक्त होता है) लगता है टाइमआउट वह नहीं है जिसे मैं ढूंढ रहा हूं? धन्यवाद। – George2

+1

आप बिल्कुल सही हैं: यदि आप डेटारिएडर को लंबे समय तक खोलते रहते हैं, तो अंतर्निहित कनेक्शन उसी समय के लिए खुला रखा जाएगा। ऐसा करने से आपको रोकने के लिए कोई समय नहीं है - यह सुनिश्चित करने के लिए आपकी ज़िम्मेदारी है कि आप इसे बहुत लंबे समय तक नहीं बनाते –

2

हाँ आप सही हैं। CommandTimeout का मतलब है समय डाटाबेस आदेश (किसी भी कमांड)

+0

क्या confuses मुझे है, DataReader SqlCommand के लिए, हम एक-एक करके डेटा प्रविष्टि एक पुनः प्राप्त सकता है, लेकिन अन्य प्रकार SqlCommand के लिए, हम एक समय में डेटा पुनः प्राप्त। तो, DataReader के लिए, टाइमआउट केवल एक डेटा एंट्री के लिए लागू होता है, न कि पूरे डेटा एंट्री पुनर्प्राप्ति लूप के लिए? अगर आप पुष्टि कर सकते हैं तो सराहना करें। :-) – George2