2009-09-22 20 views
5

नहीं बदलता है मुझे ADO.NET 2.0 विलय/आयात डेटा के साथ समस्याएं आ रही हैं। मुझे एक सामान्य तालिका से डेटा को एक समान स्कीमा बनाए रखने वाली दोनों तालिकाओं के साथ अद्यतन/सम्मिलित करने की आवश्यकता है। निम्नलिखित कोड अच्छा काम करता है स्थानीय स्तर पर है, लेकिन डेटाबेस में परिवर्तन कर नहीं करता है:DataTable.Merge और DataTable.ImportRow RowState

 OleDbDataAdapter localDA = loadLocalData();    
     OleDbDataAdapter hostedDA = loadHostedData();    

     DataSet dsLocal = new DataSet();    
     localDA.Fill(dsLocal); 

     DataSet dsChanges = new DataSet(); 
     hostedDA.Fill(dsChanges); 

     dsLocal.Tables[0].Merge(dsChanges.Tables[0],false); 

     localDA.Update(dsLocal.Tables[0]); 

ही इस कोड स्निपेट के साथ सत्य है:

 OleDbDataAdapter localDA = loadLocalData(); 
     OleDbDataAdapter hostedDA = loadHostedData(); 

     DataSet dsLocal = new DataSet(); 
     localDA.Fill(dsLocal); 

     DataSet dsChanges = new DataSet(); 
     hostedDA.Fill(dsChanges); 

     foreach (DataRow changedRow in dsChanges.Tables[0].Rows) 
     { 
      if (recordExists(dsLocal.Tables[0], changedRow["ID"])) 
      { 

      } 
      else 
      { 
       dsLocal.Tables[0].ImportRow(changedRow); 
      } 
     } 

     localDA.Update(dsLocal.Tables[0]); 

जब मैं के लिए बदल/संलग्न RowState संपत्ति को देखा पंक्तियां वे "अपरिवर्तित" रहती हैं। यदि संभव हो तो मैं कॉलम मैपिंग डेटा से बचने के लिए चाहता हूं, जो मुझे NewRow() विधि का उपयोग करके और मौजूदा पंक्ति को संशोधित करने के लिए करना पड़ सकता है।

+0

मैं ऐसे समाधान के साथ आ सकता हूं जो आयात पंक्ति का उपयोग करते समय रोस्टेट को संशोधित करता है। निम्नलिखित कोड स्निपेट काम करेगा: dsLocal.Tables [0] Iportport (changeRow); dsLocal.Tables [0] .Rows [dsLocal.Tables [0] .Rows.Count - 1] .SetAdded(); हालांकि, यह पंक्तियों को जोड़ने और पंक्तियों को अपडेट करने पर ही काम करता है। मर्ज पर कोई भी विचार बहुत उपयोगी होगा! –

उत्तर

6

आपको प्रत्येक डेटारो के लिए उपयुक्त फ़ंक्शन को बंद करने की आवश्यकता है।

  • DataRow.SetAdded()
  • DataRow.SetModified()

यह DataRow.RowState मूल्य अद्यतन करेगा। डेटाएडाप्टर यह निर्धारित करने के लिए जाता है कि किन पंक्तियों को उन पर किए गए कार्यों की आवश्यकता होती है।

यह अच्छा होगा अगर वे .net में बाइंड किए गए डेटासेट की तरह कुछ हों ताकि यह हमारे लिए इन विशाल विवरणों का प्रबंधन करे।

using (DataTableReader changeReader = new DataTableReader(dsChanges.Tables[0])) 
    dsLocal.Tables[0].Load(newTableReader, LoadOption.Upsert); 

इस परिवर्तन की मेज और "upserts" पढ़ता है 'स्थानीय' तालिका में, आप उचित परिवर्तन सूचनाएं दे रही है:

+0

नोट, जब मैं 'row.SetAdded() 'का उपयोग करता हूं, मुझे एक अपवाद मिलता है: * सेटएड और सेटमोडिफाइड का उपयोग केवल तभी किया जा सकता है जब पंक्ति स्थिति अपरिवर्तित हो। * – IAbstract

+0

आप केवल एक समय में उनमें से एक का उपयोग करना चाहते हैं। – JeffO

5

व्यवहार आप चाहते हैं पाने के लिए, मैं dsLocal.Tables[0].Merge(dsChanges.Tables[0],false); के बजाय निम्नलिखित किया था।

+0

बहुत बढ़िया, यह सुझाव काम करता है। – user469104