किसी DataRow को कॉपी या क्लोन करने का सरल तरीका?


118

मैं DataRow का क्लोन बनाने का एक सरल तरीका खोज रहा हूँ। तरह तरह से उस रो का स्नैपशॉट लेना और उसे सहेजना। मूल पंक्ति के मान तब बदलने के लिए स्वतंत्र हैं लेकिन हमारे पास अभी भी एक और सहेजी गई प्रति है जो परिवर्तित नहीं होती है। क्या इसे करने का सही तरीका है?

DataRow Source, Destination;
// Assume we create some columns and fill them with values
Destination.ItemArray = Source.ItemArray;

क्या यह केवल स्नैपशॉट के आइटमअरे को स्रोत में एक को इंगित करने के लिए सेट करेगा या क्या यह वास्तव में एक अलग प्रतिलिपि बनाता है? क्या मुझे इसके बजाय ऐसा करना चाहिए?

Destination.ItemArray = Source.ItemArray.Clone();

संपादित करें: मुझे नहीं लगता कि दूसरा कोड स्निपेट वास्तव में संकलित है।


मुझे यकीन नहीं है कि मैं समझ गया हूं, आप एक तालिका से दूसरी तालिका में एक डेटारो को कॉपी करना चाहते हैं? यदि ऐसा है तो मुझे विश्वास है कि DataTable.ImportRow का उपयोग करने के बाद आप क्या कर रहे हैं।
मो पटेल

ठीक है, मैं देख रहा हूं कि मेरे प्रश्न को अब फिर से काम करने की आवश्यकता है
पॉल मैथ्यूज

2
ध्यान दें कि कुछ परिदृश्यों में आपको ऐसा करने की आवश्यकता नहीं हो सकती है क्योंकि डेटारो स्वयं BeginEdit / EndEdit / CancelEdit के साथ लेनदेन संपादन का समर्थन करता है; भी आप कॉल कर सकते हैं।
पीटरग

जवाबों:


185

आप एक ही स्कीमा के साथ डेटाटेबल से रो को कॉपी करने के लिए ImportRowविधि का उपयोग कर सकते हैं :

var row = SourceTable.Rows[RowNum];
DestinationTable.ImportRow(row);

अपडेट करें:

आपके नए संपादन के साथ, मेरा मानना ​​है:

var desRow = dataTable.NewRow();
var sourceRow = dataTable.Rows[rowNum];
desRow.ItemArray = sourceRow.ItemArray.Clone() as object[];

काम करेगा


जाहिरा तौर पर क्लोन () केवल एक उथले प्रति प्रदान करता है। क्या आपको लगता है कि एक समान प्रतिलिपि बनाने के लिए पर्याप्त होगा या एक गहरी क्लोन की आवश्यकता है?
पॉल मैथ्यूज

5
@PaulMatthews: सौभाग्य से डेटाटेबल में मान प्रकार होते हैं, रेफ प्रकार नहीं, इसलिए उथले कॉपी वैल्यू में ओएस
डी

16
इस पोस्ट को खोजने वाले लोगों के लिए मैं निम्नलिखित जोड़ूंगा क्योंकि मुझे अक्सर पूछा जाता है ताकि मुझे लगता है कि अन्य लोग भ्रमित हो सकते हैं। क्लोन केवल संरचना की प्रतिलिपि बनाएँ, प्रतिलिपि संरचना की प्रतिलिपि बनाएँ और फिर डेटा। कहा जा रहा है कि डेटा को कॉपी करने का एक और आसान तरीका यह है कि एक बार दोनों टेबल इंस्टेंटिएट को गंतव्य तालिका में एक नई पंक्ति बनाने के लिए और निम्नलिखित का उपयोग करना है: destRow.ItemArray = sourceRow.ItemArrayफिर सरल पंक्ति को वापस जोड़ेंdestTable.Rows.Add(destRow);
फ्रेंक

1
मैं इस विधि का उपयोग करने की कोशिश कर रहा हूं ताकि डेटारो का क्लोन मिल सके। मैं निम्नलिखित चरणों का पालन करता हूं, फिर मैंने उस डेटाटेबल को साफ़ कर दिया जिसमें स्रोत पंक्ति शामिल है और अब मेरे पास रिक्त क्षेत्रों के साथ स्रोत पंक्ति है।
सर्गेटे इसुपोव

मैंने पाया कि ImportRow पद्धति का उपयोग करना मेरे लिए काम करता है, जहाँ NewRow विधि नहीं थी।
ओल्डडॉग

2

नोट: क्यूंगले के हेलफुल उत्तर में सभी अवयव हैं, लेकिन समाधान को सुव्यवस्थित किया जा सकता है (इसकी कोई आवश्यकता नहीं है .ItemArray) और पूछे गए प्रश्न से बेहतर मिलान करने के लिए फिर से तैयार किया जा सकता है।

किसी दिए गए System.Data.DataRowउदाहरण का (पृथक) क्लोन बनाने के लिए , आप निम्नलिखित कार्य कर सकते हैं:

// Assume that variable `table` contains the source data table.

// Create an auxiliary, empty, column-structure-only clone of the source data table.
var tableAux = table.Clone();
// Note: .Copy(), by contrast, would clone the data rows also.

// Select the data row to clone, e.g. the 2nd one:
var row = table.Rows[1];

// Import the data row of interest into the aux. table.
// This creates a *shallow clone* of it.
// Note: If you'll be *reusing* the aux. table for single-row cloning later, call
//       tableAux.Clear() first.
tableAux.ImportRow(row);

// Extract the cloned row from the aux. table:
var rowClone = tableAux.Rows[0];

नोट: उथले क्लोनिंग का प्रदर्शन किया जाता है , जो स्तंभ मानों के साथ-साथ काम करता है, जो मूल्य प्रकार के उदाहरण हैं, लेकिन संदर्भ प्रकार के उदाहरणों वाले कॉलम मानों की स्वतंत्र प्रतियां बनाने के लिए और अधिक काम करने की आवश्यकता होगी (और ऐसी स्वतंत्र प्रतियां बनाना हमेशा संभव नहीं होता है )।


1

ऐसा लगता है कि आप पूरे डेटाटेबल को कॉपी के रूप में नहीं रखना चाहते, क्योंकि आपको केवल कुछ पंक्तियों की आवश्यकता है, है ना? यदि आपको एक ऐसा क्रेतेरिया मिला है जिसे आप मेज पर एक चयन के साथ निर्दिष्ट कर सकते हैं, तो आप उन पंक्तियों को कॉपी कर सकते हैं जैसे Dataow का एक अतिरिक्त बैकअप सरणी

DataRow[] rows = sourceTable.Select("searchColumn = value");

.Select () फ़ंक्शन को कई विकल्प मिले और यह एक उदाहरण एक SQL के रूप में पढ़ा जा सकता है

SELECT * FROM sourceTable WHERE searchColumn = value;

फिर आप उन पंक्तियों को आयात कर सकते हैं जिन्हें आप ऊपर वर्णित के रूप में चाहते हैं।

targetTable.ImportRows(rows[n])

... किसी भी मान्य n के लिए आपको पसंद है, लेकिन कॉलम प्रत्येक तालिका में समान होना चाहिए।

ImportRow के बारे में कुछ बातें जो आपको पता होनी चाहिए कि प्राथमिक कुंजियों का उपयोग करते समय रनटाइम के दौरान त्रुटियां होंगी!

पहले मैं यह जांचना चाहता था कि क्या पहले से ही एक पंक्ति मौजूद थी जो एक लापता प्राथमिक कुंजी के कारण भी विफल हो गई थी, लेकिन फिर जांच हमेशा विफल रही। अंत में मैंने मौजूदा पंक्तियों को पूरी तरह से साफ़ करने और उन पंक्तियों को आयात करने का फैसला किया जो मैं फिर से चाहता था।

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

यह संदर्भ प्राथमिक प्रमुख त्रुटियों की भी व्याख्या करता है, जब मैंने पहली बार पंक्ति को आयात करने की कोशिश की थी क्योंकि यह वास्तव में दोगुना हो गया था।


-4

लेकिन यह सुनिश्चित करने के लिए कि आपकी नई पंक्ति नई तालिका में उपलब्ध है, आपको तालिका बंद करने की आवश्यकता है:

DataTable destination = new DataTable(source.TableName);
destination = source.Clone();
DataRow sourceRow = source.Rows[0];
destination.ImportRow(sourceRow);

3
यदि कोड की दूसरी पंक्ति चर को फिर से असाइन करती है तो कोड की पहली पंक्ति का क्या मतलब है?
एरिक फिलिप्स

यह उत्तर अधिक स्पष्टीकरण का उपयोग कर सकता है (और मुझे नहीं पता कि तालिका को बंद करने का क्या मतलब है) और @ ErikPhilips में एक बिंदु ( DataTable destination = source.Clone()करना चाहिए) है, लेकिन अन्यथा यह उत्तर पूरी तरह से ठीक है और .ItemArrayस्वीकृत उत्तर में दृष्टिकोण के लिए भी बेहतर है ।
mklement0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.