কোনও ডেটারো অনুলিপি বা ক্লোন করার সহজ উপায়?


118

আমি একটি ডেটা রো এর ক্লোন তৈরি করার সহজ উপায় খুঁজছি। এই সারিটির স্ন্যাপশট নেওয়া এবং এটি সংরক্ষণের মতো। আসল সারিগুলির মানগুলি তখন পরিবর্তিত হয় তবে আমাদের কাছে এখনও অন্য একটি সংরক্ষিত অনুলিপি রয়েছে যা পরিবর্তিত হয় না। এটি কি এটি করার সঠিক উপায়?

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

এটি কি কেবল স্ন্যাপশটের আইটেমআরাই রেফারেন্সটিকে উত্সের মধ্যে একটিতে নির্দেশ করতে সেট করবে বা এটি আসলে একটি পৃথক অনুলিপি তৈরি করবে? পরিবর্তে আমি এই কাজ করা উচিত?

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

সম্পাদনা: আমি মনে করি না দ্বিতীয় কোড স্নিপেট আসলে সংকলন করে।


আমি নিশ্চিত যে আমি বুঝতে পেরেছি না, আপনি একটি টেবিল থেকে অন্য টেবিলের উপর একটি ডাতারো অনুলিপি করতে চান? যদি তাই হয় তবে আমি বিশ্বাস করি যে ডেটা টেবিল ব্যবহার করুন mp ইম্পোর্টআরও আপনার পরে।
মো প্যাটেল

ঠিক আছে, আমি দেখতে পাচ্ছি যে আমার প্রশ্নের এখনই পুনরায় কাজ করা দরকার
পল ম্যাথিউস

2
মনে রাখবেন যে কিছু পরিস্থিতিতে আপনার এটি করার প্রয়োজন হতে পারে না কারণ ডেটারো নিজেই বিগ্রেইডিট / এন্ডএডিট / বাতিলএডিট দিয়ে লেনদেন সম্পাদনা সমর্থন করে; এছাড়াও আপনি কল করতে পারেন .এটি পরিবর্তন করুন।
পিটারজি

উত্তর:


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
@ পলম্যাথিউজ: ভাগ্যক্রমে ডেটা টেবিলটিতে মানের ধরণ রয়েছে, রেফ টাইপ নেই, তাই মূল্য প্রকারের অগভীর অনুলিপিটি অনুলিপি সহ অনুলিপি করুন
কুওঙ্গেল

16
লোকেরা এই পোস্টটি সন্ধান করার জন্য আমি নিম্নলিখিতগুলি যুক্ত করব কারণ আমাকে প্রায়শই জিজ্ঞাসা করা হয়েছিল যাতে আমার ধারণা অন্যান্য লোকেরা বিভ্রান্ত হতে পারে। ক্লোনটি কেবল কাঠামোর অনুলিপি করুন, কাঠামোর অনুলিপি করুন তারপর ডেটা। উভয় টেবিল তাত্ক্ষণিকভাবে ইনস্ট্যান্ট করা হলে ডেটা অনুলিপি করার আরেকটি সহজ উপায় বলা হচ্ছে গন্তব্য সারণীতে একটি নতুন সারি তৈরি এবং নিম্নলিখিতগুলি ব্যবহার করুন: destRow.ItemArray = sourceRow.ItemArrayতারপরে সহজ সারিটি যুক্ত করুনdestTable.Rows.Add(destRow);
ফ্রাঙ্ক

1
আমি ডেটারোর ক্লোন পেতে এই পদ্ধতিটি ব্যবহার করার চেষ্টা করছি। আমি নিম্নলিখিত পদক্ষেপগুলি করি, তারপরে আমি ডেটাটেবলটি সাফ করি যেখানে উত্স সারি রয়েছে এবং এখন ফাঁকা ক্ষেত্র সহ আমার উত্স সারি রয়েছে।
সের্গে ইসুপভ

আমি খুঁজে পেয়েছি যে আমদানি পদ্ধতিটি ব্যবহার করা আমার পক্ষে কাজ করেছিল, যেখানে নিউরো পদ্ধতিটি হয়নি।
ওল্ডডগ

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

দেখে মনে হচ্ছে আপনি পুরো ডেটা টেবিলটি অনুলিপি হিসাবে রাখতে চান না, কারণ আপনার কেবল কিছু সারি প্রয়োজন, তাই না? যদি আপনি কোনও ক্রেটিরিয়া পেয়ে থাকেন তবে আপনি টেবিলের একটি নির্বাচন দিয়ে নির্দিষ্ট করতে পারেন, আপনি কেবলমাত্র সেই সারিগুলিকে ডাটাআরোর অতিরিক্ত ব্যাকআপ অ্যারেটিতে অনুলিপি করতে পারবেন

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

.Select () ফাংশনটি বেশ কয়েকটি বিকল্প পেয়েছে এবং এই উদাহরণটি একটি এসকিউএল হিসাবে পড়তে পারে

SELECT * FROM sourceTable WHERE searchColumn = value;

তারপরে আপনি উপরে বর্ণিত অনুযায়ী সারিগুলি সন্ধান করতে পারেন আমদানি করতে পারেন।

targetTable.ImportRows(rows[n])

... আপনার পছন্দ মতো কোনও বৈধ এন এর জন্য, তবে প্রতিটি টেবিলের মধ্যে কলামগুলি একই হওয়া দরকার।

ইমপোর্টআর সম্পর্কে আপনার কিছু জিনিস জানা উচিত তা হল প্রাথমিক কীগুলি ব্যবহার করার সময় রানটাইমের সময় ত্রুটি থাকবে!

প্রথমে আমি চেক করতে চেয়েছিলাম যে একটি সারি ইতিমধ্যে বিদ্যমান ছিল যা অনুপস্থিত প্রাথমিক কীটির কারণেও ব্যর্থ হয়েছিল, তবে চেকটি সর্বদা ব্যর্থ হয়। শেষ পর্যন্ত আমি বিদ্যমান সারিগুলি পুরোপুরি সাফ করার এবং আমার সারি সারিগুলি পুনরায় আমদানি করার সিদ্ধান্ত নিয়েছে।

দ্বিতীয় সংখ্যাটি কী ঘটেছিল তা বুঝতে সাহায্য করেছিল। আমি যেভাবে আমদানি ফাংশনটি ব্যবহার করছি তা হ'ল একটি কলামে এক্সচেঞ্জ এন্ট্রি সহ সারিগুলি নকল করা। আমি বুঝতে পারি যে এটি সর্বদা পরিবর্তিত হয়েছে এবং এটি এখনও অ্যারেতে থাকা সারিটির একটি রেফারেন্স। আমাকে প্রথমে আসলটি আমদানি করতে হয়েছিল এবং তারপরে আমি চাইলে প্রবেশের পরিবর্তন করতে হয়েছিল।

রেফারেন্সটি প্রাথমিক কী ত্রুটিগুলিও ব্যাখ্যা করে যা আমি প্রথমদিকে সারিটি দ্বিগুণ হওয়ার কারণে আমদানি করার চেষ্টা করি appeared


-4

তবে নতুন সারণিতে আপনার নতুন সারিটি অ্যাক্সেসযোগ্য কিনা তা নিশ্চিত করার জন্য আপনাকে টেবিলটি বন্ধ করতে হবে:

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

3
কোডের দ্বিতীয় লাইনের চলকটি পুনরায় বরাদ্দ দিলে কোডের প্রথম লাইনের বিন্দুটি কী?
এরিক ফিলিপস

এই উত্তরটি আরও ব্যাখ্যা ব্যবহার করতে পারে (এবং টেবিলটি বন্ধ করার কী দরকার তা আমি জানি না ) এবং @ এরিক ফিলিপসের একটি পয়েন্ট রয়েছে (DataTable destination = source.Clone() উচিত) তবে অন্যথায় এই উত্তরটি পুরোপুরি সূক্ষ্ম এবং .ItemArrayস্বীকৃত উত্তরের পদ্ধতির চেয়েও পছন্দনীয় ।
mklement0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.