2010-01-18 12 views
5

मुझे LINQ से SQL में डेटाबेस की दूसरी यात्रा करने के बिना के बिना तालिका से प्राथमिक कुंजी आईडी संख्या कैसे प्राप्त होगी?दूसरी यात्रा के बिना तालिका से प्राथमिक कुंजी कैसे प्राप्त करें?

अभी, मैं एक टेबल पर डेटा जमा करता हूं, और यह पता लगाने के लिए एक और यात्रा करता हूं कि नए क्षेत्र को कौन सा आईडी असाइन किया गया था (एक ऑटो वृद्धि आईडी फ़ील्ड में)। मैं LINQ से SQL में ऐसा करना चाहता हूं और कच्चे SQL में नहीं (अब मैं रॉ एसक्यूएल का उपयोग नहीं करता)।

इसके अलावा, मेरे प्रश्न का दूसरा भाग यह है: मैं हमेशा ऑनलाइन उपयोगकर्ता की पहचान जानने के लिए सावधान रहना चाहता हूं क्योंकि मैं अपनी आईडी का उपयोग करके विभिन्न आईडी में अपनी जानकारी को GUID या उपयोगकर्ता नाम का उपयोग करने के विपरीत कहूंगा, जो सभी लंबे तार हैं। मैं ऐसा इसलिए करता हूं क्योंकि मुझे लगता है कि SQL सर्वर एक संख्यात्मक तुलना कर रहा है (?) उपयोगकर्ता नाम (स्ट्रिंग) या यहां तक ​​कि एक guid (बहुत लंबी स्ट्रिंग) की तुलना में अधिक कुशल है। मेरे प्रश्न है, क्या मैं उससे ज्यादा चिंतित हूं? उपयोगकर्ता स्थिति (int32) को हमेशा सत्र स्थिति में रखने के अंतर का अंतर है?


@RedFilter पहला सवाल के लिए कुछ रोचक/वादा किया जाता है प्रदान की, क्योंकि मैं, इस स्तर के लिए उन्हें कोशिश करने में असमर्थ पर हूँ किसी को भी जानता है या इन परिवर्तनों है कि वह अपने जवाब की टिप्पणी अनुभाग में सिफारिश की पुष्टि कर सकते हैं तो क्या होगा?

उत्तर

0

T-SQL में, आप आउटपुट खंड इस्तेमाल कर सकते हैं, कह रही:

INSERT table (columns...) 
OUTPUT inserted.ID 
SELECT columns... 

तो अगर आपको लगता है कि आवेषण करने के लिए निर्माण का उपयोग करने के LINQ कॉन्फ़िगर कर सकते हैं, तो आप शायद इसे वापस आसानी से मिल सकता है। लेकिन क्या LINQ किसी प्रविष्टि से मूल्य वापस प्राप्त कर सकता है, मैं किसी और को इसका जवाब दूंगा।

+0

मुझे नहीं पता है कि एसक्यूएल लैंग में एसक्यूएल प्रक्रियाओं लिखने के लिए। लेकिन अगर मैं बहुत यकीन कर सकता हूं कि linq अपने .dbml फ़ाइल डिजाइनर में एसक्यूएल संग्रहीत प्रक्रियाओं को मैप कर सकता है, तो यह वापसी मान प्राप्त करने में सक्षम होना चाहिए, शायद तभी आप टी-एसक्यूएल का उपयोग कर पूरे इंसर्ट करते हैं ... अन्यथा मैं अनिश्चित हूं भी। –

+0

मुझे लगता है कि InsertOn सबमिट या सबमिट की वापसी मूल्य के रूप में सबमिट करें जो हमारी आवश्यकताओं के लिए प्रासंगिक है। –

2

लिंक से एसक्यूएल स्वचालित रूप से आपके क्लास का पहचान मान सेट करता है जब आप एक नया रिकॉर्ड डालते हैं। बस संपत्ति का उपयोग करें। मुझे नहीं पता कि यह इसके लिए एक अलग क्वेरी का उपयोग करता है या नहीं, इसका उपयोग कभी नहीं किया गया है, लेकिन ओआरएम को अंतिम डालने वाली आईडी वापस पाने के लिए किसी अन्य क्वेरी की आवश्यकता नहीं है।

दो तरीके आप इस एसक्यूएल के लिए LINQ के स्वतंत्र (कि इसके साथ काम कर सकते हैं) कर सकते हैं:

: यदि आप SQL सर्वर 2005 या उच्चतर उपयोग कर रहे हैं)

1, आप आउटपुट खंड का उपयोग कर सकते

INSERT, UPDATE, या DELETE कथन से प्रभावित प्रत्येक पंक्ति पर आधारित, अभिव्यक्तियों के आधार पर जानकारी देता है। ये परिणाम प्रसंस्करण अनुप्रयोग पर लौटने के लिए संदेश, संग्रहण, और अन्य एप्लिकेशन आवश्यकताएं जैसे पुष्टिकरण अनुप्रयोगों में उपयोग के लिए लौट सकते हैं। वैकल्पिक रूप से, परिणाम को किसी तालिका या तालिका चर में डाला जा सकता है।

2) वैकल्पिक रूप से, अगर आप इस तरह एक बैच सम्मिलित बयान का निर्माण कर सकते हैं:

insert into MyTable 
(field1) 
values 
('xxx'); 
select scope_identity(); 

जो कम से कम रूप में वापस दूर काम करता है एसक्यूएल सर्वर के रूप में 2000

+0

हाय orbMan, यदि linq से sql ऑटो ने सबमिटChanges के बाद किसी वर्ग के आईडी कॉलम को अद्यतन किया है, तो यह शानदार होगा, क्या कोई इसकी पुष्टि कर पाएगा? –

+0

@ Erx_VB.NExT.Coder: यदि आप इसे बताते हैं, तो यह इन्सर्ट पर आईडी कॉलम अपडेट करेगा। डिफ़ॉल्ट रूप से, यदि आपका आईडी कॉलम टाइप int है, तो यह स्वचालित रूप से "डालने पर जेनरेट" पर सेट हो जाएगा, यदि यह टाइप ग्रिड है, तो आपको डिफ़ॉल्ट को "सम्मिलित करें" पर बदलना होगा। आप लिंक 2 एसक्यूएल डिजाइनर से करते हैं। –

+0

@EgilHansen आह, शानदार, क्योंकि जब मैं इस की कोशिश की, यह बॉक्स से बाहर काम नहीं था, मैं इन परिवर्तनों को लागू करने और फिर से कोशिश करते हैं और आपको पता है कि यह कैसे जाता है (जैसे ही मैं इस विशेष परियोजना या किसी अन्य पर वापस मिल जाएगा कि LINQ से SQL का उपयोग करता है)। –

4

जब तक आप से बाहर कुछ कर रहे हैं साधारण, उत्पन्न होने वाली प्राथमिक कुंजी को पुनर्प्राप्त करने के लिए आपको कुछ भी अतिरिक्त करने की आवश्यकता नहीं है।

जब आप अपने Linq करने वाली एसक्यूएल DataContext पर SubmitChanges कहते हैं, तो यह अपने आप वस्तुओं के लिए प्राथमिक कुंजी मान अद्यतन करता है।

अपने दूसरे प्रश्न के बारे में - के रूप में varchar (की तरह कुछ करने का विरोध किया संख्यात्मक फ़ील्ड पर स्कैन करके एक छोटे से प्रदर्शन में सुधार हो सकता है), लेकिन आप यह सुनिश्चित करें कि आप सही कॉलम में है द्वारा बेहतर प्रदर्शन किसी भी तरह से देखेंगे आपका डेटाबेस अनुक्रमित। और, SQL सर्वर के साथ यदि आप किसी पहचान कॉलम का उपयोग करके प्राथमिक कुंजी बनाते हैं, तो डिफ़ॉल्ट रूप से इसके ऊपर क्लस्टर इंडेक्स होगा।

+0

हैलो, धन्यवाद, सबमिट करने के दौरान आपका ऑटो बढ़ गया है, यह कोई समस्या नहीं है - मुझे इस नंबर/आईडी को अन्य रिकॉर्डों को कॉल करने के लिए इसका उपयोग करने की आवश्यकता है, यही कारण है कि मैं इसे सत्र स्थिति में क्यों चाहता हूं। –

12

आप ऑब्जेक्ट के संदर्भ है, तो आप सिर्फ इतना है कि संदर्भ का उपयोग करें और प्राथमिक कुंजी फोन के बाद आप db.SubmitChanges() कॉल कर सकते हैं। LINQ ऑब्जेक्ट स्वचालित रूप से SQL सर्वर के माध्यम से असाइन किए गए नए को प्रतिबिंबित करने के लिए अपने (पहचानकर्ता) प्राथमिक कुंजी फ़ील्ड को अपडेट कर देगा।

उदाहरण (vb.net):

Dim db As New NorthwindDataContext 
    Dim prod As New Product 
    prod.ProductName = "cheese!" 
    db.Products.InsertOnSubmit(prod) 
    db.SubmitChanges() 
    MessageBox.Show(prod.ProductID) 

आप शायद एक समारोह में उपरोक्त कोड में शामिल हैं और ProductID (या समतुल्य प्राथमिक कुंजी) लौट सकते हैं और इसे कहीं और इस्तेमाल कर सकते हैं।

संपादित करें: यदि आप परमाणु अपडेट नहीं कर रहे हैं, तो आपको एक अलग संग्रह के लिए हर नए उत्पाद को जोड़ सकते हैं और इसके माध्यम से पुनरावृति के बाद आप SubmitChanges कह सकते हैं। मेरी इच्छा है कि LINQ ने डेटासेट की तरह 'डेटाबेस स्नीक पीक' प्रदान किया हो।

+0

@calico: धन्यवाद दोस्त जो पूरी तरह से समझाया गया था, यहां कुछ वीबी कोड देखने के लिए भी ताज़ा किया गया है, फिर भी आपको ऊपर दिया गया है और जवाब स्वीकार कर रहा है, इसलिए अब आप peeps को कम करना शुरू कर सकते हैं :) –

+0

बस आपको बताने के लिए, मैंने कोशिश की जमा करने के बाद एक संदर्भित ऑब्जेक्ट के पॉर्डक्टिड को कॉल करें और यह बिल्कुल काम नहीं करता है। हालांकि मैंने "जैसा है" कोड से ऊपर की कोशिश नहीं की है, लेकिन यह सिद्धांत रूप में समान था, किसी भी विचार से यह पिक क्यों हो सकता है? –

+0

क्या आप वाकई सबमिशन सफल रहे हैं? क्या आप वाकई एक ही ऑब्जेक्ट का संदर्भ दे रहे हैं? मुझे आपका कोड नहीं पता इसलिए मैं निश्चित नहीं हो सकता। –

0

कि आईडी रिटर्न के रूप में एक निर्गम पैरामीटर शायद सबसे आसान तरीका है LINQ से एक संग्रहीत प्रक्रिया कॉलिंग।

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