2009-05-31 7 views
6

मैं अपने वीबी अनुप्रयोगों में ADO.NET डेटासेट का उपयोग कर रहा हूं। मेरे पास एक अभिभावक तालिका और कई बाल तालिकाओं वाला एक टाइप किया गया डेटासेट है। जब मैं अभिभावक तालिका में डेटा डालता हूं और उसी कुंजी के साथ सभी बाल तालिकाओं में डेटा अपडेट करता हूं (जैसे फोरजिन कुंजी) मैं पहचान कुंजी उत्पन्न करना चाहता हूं।स्वत: जेनरेटेड पहचान कुंजी के साथ डेटासेट अभिभावक और बाल तालिकाओं को कैसे अपडेट करें?

आखिरकार, मैं डेटाबेस (SQL Server08) में डेटासेट अपडेट करना चाहता हूं।

ठीक है, ऊपर की ओर सीधे डाटाबेस में मूल तालिका डालने से ऊपर की बात संभव हो सकती है, पहचान कॉलम प्राप्त करें और चाइल्ड टेबल के लिए उपयोग करें।

लेकिन मैं एक स्वत: आपरेशन के रूप में इस करना चाहते हैं (LINQ की तरह एसक्यूएल करने के लिए जो DataContext में प्राथमिक & विदेशी कुंजी का ख्याल रखता है।)

मैं ऐसे जो जनक और बच्चे के लिए स्व-उत्पन्न स्तंभ का ख्याल रखता है डेटासेट में संभव बात टेबल?

धन्यवाद,

एबीबी

उत्तर

4

मुझे लगता है कि यह और अधिक स्पष्ट होना चाहिए और बिना किसी tweaking के काम करना चाहिए। लेकिन फिर भी, यह बहुत आसान है।

  1. बनाएं बच्चे और माता पिता तालिकाओं के बीच DataRelation और यह अद्यतन पर झरना करने के लिए सेट:

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

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId")) 
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade 
    
  2. डेटासेट डालने और अद्यतन आदेशों दो तरह से कर रहे हैं: अगर कोई उत्पादन मानकों बाध्य या किसी डेटा पंक्तियां लौटे वे डाटासेट पंक्ति है कि अद्यतन की वजह से अद्यतन करने के लिए इस्तेमाल किया जाएगा रहे हैं।

    यह इस विशेष समस्या के लिए सबसे उपयोगी है: स्वत: जेनरेटेड कॉलम एप्लिकेशन पर वापस प्राप्त करना। पहचान के अलावा यह उदाहरण के लिए एक टाइमस्टैम्प कॉलम हो सकता है। लेकिन पहचान सबसे उपयोगी है।

    हमें बस इतना करना है कि पहचान वापस करने के लिए सम्मिलित करें। ऐसा करने के कई तरीके हैं, उदाहरण के लिए:

    ए) आउटपुट पैरामीटर के साथ संग्रहीत प्रक्रिया का उपयोग करना। यह "असली" डेटाबेस के बीच सबसे पोर्टेबल तरीका है।

    बी) कई SQL कथन का उपयोग करके, अंतिम एक लौटने वाली पंक्ति के साथ। यह AFAIK एसक्यूएल सर्वर के लिए विशिष्ट है, लेकिन सबसे सरल:

    insert into Parent (Col1, Col2, ...) values (@Col1, @Col2, ...); 
    select * from Parent where Id = SCOPE_IDENTITY(); 
    

इसे सेट अप करने के बाद, तुम सब करने की जरूरत है Id कि अद्वितीय हैं के साथ माता-पिता पंक्तियों (एकल डाटासेट भीतर) बना है, लेकिन असंभव में डेटाबेस। नकारात्मक संख्या आमतौर पर एक अच्छी पसंद होती है।फिर, जब आप डेटाबेस में डेटासेट परिवर्तनों को सहेजते हैं, तो सभी नई मूल पंक्तियों को डेटाबेस से Id s वास्तविक मिलेगा।


नोट: यदि आपके पास कई बयानों का समर्थन करता है बिना और संग्रहित प्रक्रियाओं (जैसे एक्सेस) के बिना डेटाबेस के साथ काम करने के लिए है, तो आप माता-पिता की मेज एडाप्टर में RowUpdated घटना पर सेटअप ईवेंट हैंडलर की आवश्यकता होगी। हनलर में आपको select @@IDENTITY कमांड के साथ पहचान प्राप्त करने की आवश्यकता है।


कुछ लिंक:

3

चीजों की युगल बताते।

  1. हां, आपको निश्चित रूप से दोनों तालिकाओं के लिए निर्दिष्ट संबंधों की आवश्यकता है। आप xsd संपादक से जांच सकते हैं (अपनी xsd फ़ाइल को डबल क्लिक करें)। डिफ़ॉल्ट रूप से संबंध 'केवल संबंध' के रूप में सेट होता है जिसमें कोई 'अद्यतन नियम' नहीं होता है। 'संबंध संपादित करें' में जाकर इस संबंध को संपादित करें और 'केवल विदेशी कुंजी प्रतिबंध' या 'दोनों ~~~' चुनें। और 'अद्यतन नियम' को कैस्केड के रूप में सेट करने की आवश्यकता है! 'नियम हटाएं' आप पर निर्भर है।

  2. अब जब आप एक नई कुंजी तालिका पंक्तियों के लिए नई कुंजी तालिका पंक्तियों के लिए एक नई मूल तालिका पंक्ति आईडी (ऑटोइनक्रिकमेंट) का उपयोग करते हैं, तो आपको नई मूल पंक्ति पंक्ति का उपयोग करने से पहले तालिका में मूल पंक्ति को जोड़ना होगा।

  3. जैसे ही आप टेबलडैप्टर का उपयोग करके अभिभावक तालिका के लिए अद्यतन को कॉल करते हैं, संबंधित बाल तालिका की नई पंक्तियों में स्वचालित माता-पिता स्वचालित रूप से होंगे।

मेरे सरल कोड के टुकड़े:

'--- Make Parent Row 
Dim drOrder as TOrderRow = myDS.TOder.NewTOrderRow 
drOrder.SomeValue = "SomeValue" 
myDS.TOrder.AddTOrderRow(drOrder) '===> THIS SHOULD BE DONE BEFORE CHILD ROWS 

'--- Now Add Child Rows!!! there are multiple ways to add a row into tables.... 
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailValue1") 
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailvalue2") 
'.... 
'.... 

'--- Update Parent table first 
myTableAdapterTOrder.Update(myDS.TOrder) 
'--- As soon as you run this Update above for parent, the new parent row's AutoID(-1) 
'--- will become real number given by SQL server. And also new rows in child table will 
'--- have the updated parentID 

'--- Now update child table 
myTableAdapterTOrderDetail.Update(myDS.TOrderDetail) 

मुझे आशा है कि यह मदद करता है!

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