2009-08-05 8 views
22

मैं किसी पुराने डेटाबेस से डेटा को परिवर्तित करने के लिए डेटासेट का उपयोग कर रहा हूं। मौजूदा ऑर्डर_आईडी संख्याओं को बनाए रखने की आवश्यकता है।डेटासेट डालने के लिए IDENTITY_INSERT को बंद करें

मैं का उपयोग कर की कोशिश की है:

SET IDENTITY_INSERT orders ON; 

यह काम करता है जब मैं SqlServer प्रबंधन स्टूडियो में हूँ, मैं सफलतापूर्वक करने में सक्षम हूँ

INSERT INTO orders (order_Id, ...) VALUES (1, ...); 

हालांकि, यह मुझे यह करने के लिए अनुमति नहीं है डेटासेट डालने के माध्यम से जो मैं अपनी रूपांतरण स्क्रिप्ट में उपयोग कर रहा हूं। जो मूल रूप से इस तरह दिखता है:

dsOrders.Insert(oldorderId, ...); 

मैंने प्रक्रिया के दौरान SQL (SET IDENTITY_INSERT ऑर्डर ऑन) चलाया है। मुझे पता है कि मैं केवल एक समय में एक टेबल के खिलाफ ऐसा कर सकता हूं और मैं हूं।

अपवाद जब आदेश तालिका में एक मान सम्मिलित System.Data.SqlClient.SqlException करने का प्रयास: जब तालिका में पहचान स्तंभ के लिए स्पष्ट मूल्य सम्मिलित नहीं कर सकते 'आदेश' identity_insert

मैं इस अपवाद प्राप्त हो रही है बंद करने के लिए सेट है।

कोई विचार?

अद्यतन

Alexs & AlexKuznetsov उल्लेख किया है कि सेट identity_insert एक कनेक्शन स्तर सेटिंग है तथापि, है जब मैं SqlProfiler में एसक्यूएल को देखो, मैं कई आदेशों पर ध्यान दें।

  • पहले - SET IDENTITY_INSERT DEAL ON
  • दूसरा - exec sp_reset_connection
  • तीसरा n करने के लिए - का चयन & डालने के

वहाँ हमेशा आदेशों के बीच एक exec sp_reset_connection हालांकि है, मुझे विश्वास है कि यह सहित मेरी विभिन्न एसक्यूएल आज्ञाओं Identity_Insert सेटिंग पर मूल्य के नुकसान के लिए ज़िम्मेदार है।

क्या मेरे डेटासेट को कनेक्शन रीसेट करने से रोकने का कोई तरीका है?

उत्तर

49

आप विकल्पों को मिलाया है:

SET IDENTITY_INSERT orders ON 

पर बारी विशिष्ट मान (आपके द्वारा निर्दिष्ट) एक तालिका में एक पहचान स्तंभ के साथ सम्मिलित करने की क्षमता होगी।

SET IDENTITY_INSERT orders OFF 

फिर उस व्यवहार बंद हो जाती है और सामान्य व्यवहार (क्योंकि वे स्वत: जनरेट कर रहे हैं आप पहचान स्तंभों के लिए मान निर्दिष्ट नहीं कर सकते हैं) को फिर से बहाल किया गया है।

मार्क

+0

लॉल, मेरे पास एक ही मूर्खतापूर्ण गलती थी – Jupaol

5

आप सेट identity_insert करने के लिए पर आप पहचान कॉलम में डालने के लिए अनुमति देना चाहते हैं।

यह थोड़ा सा पीछे लगता है, लेकिन यह वैसे ही काम करता है। सेट identity_insert आदेश पर एसक्यूएल सर्वर की ओर पर सही तरीका है:

+0

आप सही थे कि मेरे पास मिश्रित विकल्प थे लेकिन जब मैंने उन्हें बदल दिया तो यह मेरे मुद्दों को हल नहीं करता था। कोई अन्य विचार? –

3

ऐसा नहीं है कि आप सब कुछ ठीक कर रहे हैं लगता है। लेकिन समस्या यह है कि आप डेटासेट का उपयोग कर रहे हैं। आपके द्वारा प्रदान किए गए कोड से मैं कह सकता हूं कि आप टाइप किए गए डेटासेट - डेटाबेस पर आधारित विजुअल स्टूडियो में जेनरेट किया गया था।

इस मामले (सबसे अधिक संभावना) तो इस डेटासेट एक बाधा है कि आप OrderID फ़ील्ड के लिए मूल्यों को निर्धारित करने की अनुमति देता है नहीं, यानी यह कोड है कि स्पष्ट मूल्य निर्दिष्ट करने की अनुमति नहीं है है शामिल है, नहीं एसक्यूएल सर्वर है । आपको डेटासेट डिज़ाइनर पर जाना चाहिए और ऑर्डर के गुणों को संपादित करना चाहिए फ़ील्ड: ऑटोइनक्रिकमेंट सेट करें और केवल गलत पर पढ़ें। लेकिन एक ही बदलाव रन टाइम में किया जा सकता है। यह आपको डेटासेट के लिए स्पष्ट मान के साथ एक पंक्ति जोड़ने की अनुमति देगा और बाद में इसे SQL सर्वर तालिका में सहेज देगा (आपको अभी भी SET IDENTITY_INSERT की आवश्यकता होगी)।

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

1

मैं यह निर्धारित करने के लिए प्रोफाइलर का उपयोग करूंगा कि आपका SET IDENTITY_INSERT ऑर्डर चालू है या नहीं; आपके बाद के आवेषण के साथ-साथ सटीक SQL को आवेषण के दौरान निष्पादित किए जाने के समान कनेक्शन से जारी किया जाता है।

1

एलेक्स सही था, समस्या इंसर्ट_इडेन्टिटी काम करती थी, लेकिन यह एक कनेक्शन स्तर सेटिंग है, इसलिए मुझे एक लेनदेन के भीतर Insert_Identity सेट करने की आवश्यकता है।

मैं रयान व्हिटेकर के TableAdapterHelper कोड

इस्तेमाल किया और मैं अपने TableAdapter कि identity_insert भाग गया पर एक अद्यतन आदेश बनाया। तब मुझे निर्दिष्ट पहचान कॉलम के साथ एक नया सम्मिलन कमांड बनाना पड़ा। मैं तो इस कोड को

SqlTransaction transaction = null; 

try 
{ 
    using (myTableAdapter myAdapter = new myTableAdapter()) 
    { 
     transaction = TableAdapterHelper.BeginTransaction(myAdapter); 
     myAdapter.SetIdentityInsert(); 
     myAdapter.Insert(myPK,myColumn1,myColumn2,...); 
    } 

    transaction.Commit(); 
} 
catch(Exception ex) 
{ 
    transaction.Rollback(); 
} 
finally 
{ 
    transaction.Dispose(); 
} 
0

मामले में आप अभी भी "insert_identity" के साथ समस्या है कि भाग गया, आप की तरह एक पूरा डालने बयान इस्तेमाल करने की कोशिश कर सकते हैं: उपयोगकर्ता में

डालने (क्रमांक, नाम) मान (1, 'jeff')

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