पंक्तियों को जोड़ने का प्रयास करते समय यह पंक्ति पहले से ही किसी अन्य तालिका त्रुटि से संबंधित है?


197

मेरे पास एक DataTable है जिसमें कुछ पंक्तियाँ हैं और मैं DataRows का एक संग्रह प्राप्त करने के लिए पंक्तियों को फ़िल्टर करने के लिए चयन का उपयोग कर रहा हूं, जिसे मैं तब फ़ॉरेस के माध्यम से लूप करता हूं और इसे किसी अन्य DataTable में जोड़ता हूं, लेकिन यह मुझे त्रुटि दे रहा है "यह पंक्ति पहले से ही है एक और तालिका के लिए "। यहाँ कोड है:

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
महान प्रश्न; मैं अन्य कंटेनरों से संबंधित पंक्तियों और तालिकाओं के बारे में उलझन में हूं
विवियन नदी

जवाबों:


339

आपको पहले Rowसे मानों के साथ एक नया बनाने की आवश्यकता है dr। A DataRowकेवल एकल का हो सकता है 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
क्या मैं ImportRow को एक एलर्नेटिव के रूप में उपयोग कर सकता हूँ? और क्यों। .NET आपको केवल अलग-अलग DataTables के लिए एक ही DataRow की अनुमति नहीं देगा? क्या यह डिजाइन द्वारा है?
Xaisoft

3
हे, मुझे सिर्फ ImportRow का एहसास हुआ, मेरे जवाब को संपादित करें और आप सभी ने मुझे इसके लिए हराया। लेकिन हाँ, मैं उस दृष्टिकोण की सिफारिश करूँगा क्योंकि यह आपके लिए पंक्ति की नकल करेगा
जोशबर्के

2
ImportRowमेरे लिए दिन का काम। लेकिन Add Rows ने किया! Thanksssssssssss
nawfal

1
यदि आपके द्वारा आयात की जाने वाली पंक्ति स्रोत तालिका में पंक्ति का संदर्भ है, तो ImportRow काम नहीं करेगा। यदि आप स्रोत पंक्ति का उपयोग करते हैं तो ItemArray काम करता है, लेकिन आपको स्रोत से पंक्ति हटाने से पहले पंक्ति को गंतव्य पर जोड़ना याद रखना होगा, अन्यथा यह शिकायत करता है कि पंक्ति हटा दी गई है और डेटा नहीं मिल सकता है।
एडम हल्ड्सवर्थ

2
.ImportRow()शुरू में मेरे लिए काम नहीं किया क्योंकि मैंने .Clone()अपने नए डेटाटेबल पर कॉलम नहीं बनाया या बनाया। यह 0 के साथ आया जब मैंने .Rows.Countअपनी नई मेज पर देखा । चूंकि मुझे अपनी टेबल पर कॉलम बनाने और उन्हें जोड़ने की आवश्यकता थी, मैंने बस एक NewRow()स्टेटमेंट बनाया और सीधे उस नई पंक्ति के कॉलम में अपना मान जोड़ दिया और लूप के भीतर अपनी पंक्ति में उस पंक्ति को जोड़ दिया (नीचे मेरा उत्तर देखें) ।
vapcguy 20

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
इसके लिए आपका धन्यवाद .. हालाँकि @JoshBerke द्वारा दिया गया उत्तर सही था, आपको काम करने के लिए मूल तालिका को अपने उदाहरण में क्लोन करने की आवश्यकता थी।
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

यह सबसे साफ / तेज / आसान / सबसे सुंदर समाधान नहीं है, लेकिन यह एक क्रूर शक्ति है जिसे मैंने एक समान परिदृश्य में काम करने के लिए बनाया है:

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
}

DataColumns में नाम काम करने के लिए आपकी मूल तालिका में उन लोगों से मेल खाना चाहिए। मैंने उदाहरण के तौर पर "आईडी" और "नाम" का उपयोग किया।


1

आप सिर्फ उपयोग क्यों नहीं करते CopyToDataTable

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

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

1
क्या आदेश है यहाँ होना चाहिए?
Avi

dtएवी से चयनित पंक्तियों का एक नया डेटाटेबल ।
vapcguy

0

आप कॉलम को कुछ आईडी दे सकते हैं और इसे विशिष्ट रूप से नाम दे सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.