2009-06-12 10 views
9

की कमी क्या है मैंने "सी # के साथ डीबी में विशाल डेटा डालने का सबसे अच्छा तरीका" के लिए कुछ शोध किया है, तो बहुत से लोगों ने मुझे बस SQLBulkCopy का उपयोग करने का सुझाव दिया है। मैंने कोशिश की और यह वास्तव में मुझे आश्चर्यचकित कर दिया। निस्संदेह, SqlBulkCopy बहुत तेज है। ऐसा लगता है कि SqlBulkCopy डेटा डालने का एक सही तरीका है (विशेष रूप से विशाल डेटा)। लेकिन हम हर समय इसका इस्तेमाल क्यों नहीं करते हैं। क्या SqlBulkCopy का उपयोग करने में कोई कमी है?SqlBulkCopy

उत्तर

9

दो कारण मैं के बारे में सोच सकते हैं:

  1. जहाँ तक मुझे पता है, यह सामान्य वर्कलोड का एक बहुत में Microsoft SQL सर्वर
  2. के लिए ही उपलब्ध है, तो आप ऐसा नहीं करते हैं थोक insert है, लेकिन कभी-कभी insert एस select एस और update एस के साथ इंटरमीक्स किया गया है। माइक्रोसॉफ्ट ने स्वयं कहा है कि SqlBulkCopy MSDN page पर, सामान्य insert इसके लिए अधिक कुशल है।

ध्यान दें कि यदि आप एक SqlBulkCopy, एक सामान्य डालने के बराबर होने का कम से कम चाहते हैं आप इसे SqlBulkCopyOptions.CheckConstraints पैरामीटर पारित करने के लिए होगा।

+0

हाँ, SqlBulkCopy केवल एमएस एसक्यूएल सर्वर के साथ उपयोग किया जा सकता है। मुझे पता है कि यह केवल एक दोष है। कभी-कभी यह वास्तव में बड़ा सौदा नहीं है। उदाहरण के लिए: हमारे ग्राहक केवल एमएस एसक्यूएल सर्वर का उपयोग करते हैं और हम केवल सिस्टम.डाटा.क्लक्लिएंट नेमस्पेस से संबंधित कई वर्गों के साथ उनके लिए एप्लिकेशन बनाते हैं। –

+0

डिफ़ॉल्ट रूप से 'SqlBulkCopyOptions.checkConstraints' झूठी क्यों है? - यह इतना उलझन में है! –

+3

@ बररीके: नहीं, यह नहीं है। नाम 'थोक प्रतिलिपि' है, इसलिए आपको डेटा कॉपी करना चाहिए जिसके लिए बाधाएं पहले से ही सही होने के लिए जानी जाती हैं, यदि नहीं तो आप नहीं जानते कि आप क्या कर रहे हैं ... :) –

13

एसकब्लूल्ककॉपी ओरेकल वी 11 के लिए भी मौजूद है, लेकिन यह ओरेकल क्लाइंट स्थापित करते समय ओरेकल .NET असेंबली द्वारा प्रदान की जाती है। SqlBulkCopy क्लास को मूल रूप से लक्षित डेटाबेस इंजन के प्रदाता द्वारा एक-एक करके कार्यान्वित किया जाता है।

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

एसकब्लूल्ककॉपी के साथ, आपको बस त्रुटि का प्रकार मिलता है और यही वह है। गुड लक इसे डीबगिंग।

+2

+1 पूरी तरह से सहमत हैं कि डिबगिंग है थोककॉपी के साथ एक मुद्दा। मेरे पास एक दृष्टिकोण है जिसे "deconstruct" करना है, बल्ककॉपी आदेशों को विफल करना और आखिरकार ब्लॉक में पंक्ति से पंक्ति डालना। इस तरह मैं अपनी त्रुटि रिपोर्टिंग के हिस्से के रूप में अपमानजनक डेटारो को इंगित कर सकता हूं। – Totero

+1

मुझे पता चला कि त्रुटि रिपोर्टिंग के लिए व्यक्तिगत विफलताओं को वापस पाने का एक तरीका है, लेकिन इसमें एक रिकॉर्ड के पृष्ठों में थोक प्रति को पुनः सबमिट करना और फिर सभी अपवादों (अपराधी पंक्तियों के साथ) को पकड़ना और फेंकना शामिल है। यह सबसे कुशल नहीं है, लेकिन यह तब होता है जब कोई त्रुटि हुई, इसलिए यह बहुत खराब नहीं है। पूर्ण लेख के लिए यहां देखें: http://www.codeproject.com/Articles/387465/Retrieving-failed-records-after-an-SqlBulkCopy-exc –

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