সারি যুক্ত করার চেষ্টা করার সময় এই সারিটি ইতিমধ্যে অন্য টেবিল ত্রুটির সাথে সম্পর্কিত?


196

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

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = new DataTable();

DataRow[] orderRows = dt.Select("CustomerID = 2");

foreach (DataRow dr in orderRows)
{
    dtSpecificOrders.Rows.Add(dr); //Error thrown here.
}

1
দুর্দান্ত প্রশ্ন; অন্যান্য ধারকগুলির সাথে সম্পর্কিত সারি এবং টেবিলগুলি সম্পর্কে আমি বিভ্রান্ত হয়ে পড়েছি
ভিভিয়ান নদী

উত্তর:


338

আপনাকে প্রথম Rowথেকেই মানগুলি তৈরি করতে হবে to drDataRowকেবলমাত্র একটি একক হতে পারে DataTable

আপনি ব্যবহার করতে পারেন Addযা মানগুলির একটি অ্যারে নেয়:

myTable.Rows.Add(dr.ItemArray)

বা সম্ভবত আরও ভাল:

// This works because the row was added to the original table.
myTable.ImportRow(dr);

// The following won't work. No data will be added or exception thrown.
var drFail = dt.NewRow()
drFail["CustomerID"] = "[Your data here]";
// dt.Rows.Add(row); // Uncomment for import to succeed.
myTable.ImportRow(drFail);

6
আমি কি সতর্কতা হিসাবে আমদানি ব্যবহার করতে পারি? এবং কেন .NET আপনাকে বিভিন্ন ডেটা টেবিলের জন্য একই ডেটারো রাখার অনুমতি দেয় না? এটা কি ডিজাইন করে?
জাইসফট

3
হেই আমি স্রেফ ইম্পোর্টআর বুঝতে পেরেছি, আমার উত্তরটি সম্পাদনা করুন এবং আপনি সকলেই আমাকে এতে প্রহার করলেন। তবে হ্যাঁ, আমি সেই পদ্ধতির সুপারিশ করব কারণ এটি আপনার জন্য সারিটি অনুলিপি করবে
জোশবার্ক

2
ImportRowআমার জন্য কাজ। তবে সারিগুলি যোগ করুন! থ্যাঙ্কসসসসসসসসস
নওফাল

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

2
.ImportRow()আমার পক্ষে কাজ করেনি কারণ আমি .Clone()আমার নতুন ডেটা টেবেলে কলাম তৈরি করি নি বা শুরু করেছিলাম। আমি .Rows.Countআমার নতুন টেবিলটির দিকে তাকালে এটি 0 নিয়ে আসে । যেহেতু আমার টেবিলে কলাম তৈরি করতে এবং সেগুলি যুক্ত করার দরকার ছিল তাই আমি কেবলমাত্র একটি NewRow()বিবৃতি তৈরি করেছি এবং সেই নতুন সারিটির কলামগুলিতে আমার মানগুলি সরাসরি যুক্ত করেছিলাম এবং লুপের মধ্যে সেই সারিটি আমার টেবিলে যুক্ত করেছি (নীচে আমার উত্তর দেখুন) ।
vapcguy

34

এটা চেষ্টা কর:

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = dt.Clone();

DataRow[] orderRows = dt.Select("CustomerID = 2");

foreach (DataRow dr in orderRows)
{
    dtSpecificOrders.ImportRow(dr);
}

3
এটির জন্য আপনাকে ধন্যবাদ .. যদিও @ জোশবার্কের দেওয়া উত্তরটি সঠিক ছিল তবে এটির কাজ করার জন্য আপনার উদাহরণ হিসাবে যেমন মূল টেবিলটি ক্লোন করা প্রয়োজন।
carny666

8
yourTable.ImportRow(dataRow);

এটি কারণ আপনি যে সারিটি অনুলিপি করছেন সেটির একই রকম নেই TableName:

উদাহরণস্বরূপ, চেষ্টা করুন:

Table1.TableName = "Table1";
Table2.TableName = "Table2";

1
আমারও একটি নামবিহীন টেবিল ছিল। ধন্যবাদ!
ব্রুনো

3
foreach (DataRow dr in dtSpecificOrders.rows)
{
   dtSpecificOrders.Rows.Add(dr.ItemArray); 
}

1
আমি মনে করি না আপনি যা পুনরাবৃত্তি করছেন তাতে আপনি কিছু যুক্ত করতে পারবেন, কারণ আপনি এর মাধ্যমে পুনরাবৃত্তি করছেন।
vapcguy

3

এটি সবচেয়ে পরিষ্কার / দ্রুত / সহজতম / সবচেয়ে মার্জিত সমাধান নয়, তবে এটি একই রকম দৃশ্যে কাজটি চালানোর জন্য আমি তৈরি একটি নিষ্ঠুর শক্তি force

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = new DataTable();

// Create new DataColumns for dtSpecificOrders that are the same as in "dt"
DataColumn dcID = new DataColumn("ID", typeof(int));
DataColumn dcName = new DataColumn("Name", typeof(string));
dtSpecificOrders.Columns.Add(dtID);
dtSpecificOrders.Columns.Add(dcName);

DataRow[] orderRows = dt.Select("CustomerID = 2");

foreach (DataRow dr in orderRows)
{
    DataRow myRow = dtSpecificOrders.NewRow();  // <-- create a brand-new row
    myRow[dcID] = int.Parse(dr["ID"]);
    myRow[dcName] = dr["Name"].ToString();
    dtSpecificOrders.Rows.Add(myRow);   // <-- this will add the new row
}

এটি কাজ করার জন্য ডেটা কলামে থাকা নামগুলি অবশ্যই আপনার মূল টেবিলের সাথে মেলে। আমি উদাহরণ হিসাবে সবেমাত্র "আইডি" এবং "নাম" ব্যবহার করেছি।


1

আপনি শুধু ব্যবহার করবেন না কেন CopyToDataTable

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = new DataTable();

DataTable orderRows = dt.Select("CustomerID = 2").CopyToDataTable();

1
অর্ডারও এখানে থাকার কথা?
আভি

dtআভি থেকে নির্বাচিত সারিগুলির একটি নতুন ডাটাবেল ।
vapcguy

0

আপনি কলামগুলিতে কিছু আইডি দিতে পারেন এবং এটির নামকরণ করতে পারেন name

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.