C# DataTable Add Row: जैसाकि हमने पिछले Discussion में समझा कि DataColumn Object हमारे DataTable Object के Schema को Define करता है। जबकि DataRow Object हमारे इसी DataTable Object के Actual Data यानी Records या Row को Represent करता है। अत: यदि हम हमारे Products Table में कुल 50 Rows हों, तो इस Table को Map करने के लिए Create किए जाने वाले DataTable Object में भी कुल 50 DataRow Objects होंगे।
DataRow Members
DataRow Object भी हमें बहुत सारी Properties व Methods Provide करता है, जिनके माध्यम से हम हमारे DataTable के DataRow को Control करने की क्षमता प्राप्त करते हैं। इनमें से कुछ ज्यादा Common रूप से काम आने वाले Members का Description निम्नानुसार है:
HasErrors Property
ये Property एक Boolean Value के रूप में इस बात को Indicate करता है कि DataRow Object में किसी प्रकार का कोई Error है या नहीं।
GetColumnsInError() Method
यदि HasErrors Property का मान True हो, तो ये इस बात का Indication होता है कि DataRow में कोई Error है। इस स्थिति में GetColumnsInError() Method का प्रयोग करके हम उस Column का पता लगा सकते हैं, जो कि Error Generate होने का कारण है।
GetColumnError() Method
Error की स्थिति में GetColumnsInError() Method का उन Columns को Return करता है, जिन्होंने Error Generate किया है। उस स्थिति में Error Generate करने वाले विभिन्न Columns को Access करने के लिए हम GetColumnError() Method का प्रयोग कर सकते है।
ClearErrors() Method
इस Method का प्रयोग करके हम Generate होने वाली Error की Description को Row से Remove कर सकते हैं।
RowError Property
ये Property किसी Specified Row के लिए Textual Description को Specify करने की सुविधा Provide करता है।
ItemArray Property
ये Property का प्रयोग करके हम एक Array Of Objects का प्रयोग करते हुए किसी Row की Column Values को Get/Set कर सकते है।
RowState Property
ये Property का प्रयोग करके हम किसी DataTable के किसी DataRow की Current State का पता लगा सकते हैं। जिसमें इस बात की जानकारी होती है कि Row Delete, Modify Unchanged या New में से किस स्थिति में है।
Table Property
ये Property का प्रयोग करके हम उस DataTable का Reference Retrieve कर सकते हैं, जिसमें हमारा DataRow Object Contained है।
AcceptChanges() Method
RejectChanges() Method
इन दोनों Methods का प्रयोग करके हम किसी Row में अन्तिम बार AcceptChanges() Method को Call करने के बाद किए गए विभिन्न Changes को Accept या Reject कर सकते हैं।
BeginEdit() Method
EndEdit() Method
CancelEdit() Method
इन तीनों Methods का प्रयोग करके हम किसी DataRow Object में किए गए किसी Edit Operation को Begin, End या Edit कर सकते हैं।
Delete() Method
इस Method का प्रयोग करके हम AcceptChanges() Method को Call करते समय किसी Row को Remove करने के लिए Mark कर सकते हैं।
IsNull() Method
इस Method का प्रयोग करके हम इस बात का पता लगा सकते हैं कि DataRow में Specified विभिन्न Columns में से कोई Specified Column null Value को Accept कर सकता है या नहीं।
जब हम DataRow Object को Use करते हैं तो इसे Use करना DataColumn को Use करने की तुलना में थोडा अलग होता है। क्योंकि DataRow Class एक Abstract Class है, जिसके Direct Object Create हीं किए जा सकते, क्योंकि इसका कोई Public Constructor नहीं होता। इसलिए यदि हम निम्नानुसार Statement लिखें:
// Error! No public constructor
DataRow drProduct = new DataRow();
इसलिए हम नए DataRow Object को DataTable Object से Obtain करते हैं। उदाहरण के लिए मानलो कि हम हमारे Products Table में दो Rows Insert करना चाहते हैं। इस जरूरत को पूरा करने के लिए हमें DataTable.NewRow() Method को Use करना होता है।
NewRow() Method Current DataTable में एक नए Row को Insert करने के लिए Space Create करता है, जिसके हर Column को Type Indexer का प्रयोग करते हुए किसी Specific Value से Fill किया जा सकता है।
इसलिए जब हम इस नए Row को Data से Fill करना चाहते हैं, तब हम DataColumn के String Formatted Name को अथवा Zero Based Ordinal Position को Use करते हुए Row के Columns में Values को Fill कर सकते हैं। जैसे:
// Now add 1 row to the Products DataTable. DataRow drProduct = ProductsTable.NewRow(); // Fill values in Newly created DataRow Columns or Fields using ColumnName drProduct["ProductName"] = "Tea"; drProduct["SupplierID"] = 1; drProduct["CategoryID"] = 1; drProduct["QuantityPerUnit"] = 10; drProduct["UnitPrice"] = 20; drProduct["UnitsInStock"] = 50; drProduct["UnitsOnOrder"] = 5; drProduct["ReorderLevel"] = 10; drProduct["Discontinued"] = "1"; ProductsTable.Rows.Add(drProduct); // Add 1 more row to the Products DataTable. drProduct = ProductsTable.NewRow(); // Column 0 is the auto-incremented ID field, so start at 1 and // Fill values in Newly created DataRow Columns or Fields using Column Indexer drProduct[1] = "Coffee"; drProduct[2] = 1; drProduct[3] = 1; drProduct[4] = 10; drProduct[5] = 20; drProduct[6] = 50; drProduct[7] = 5; drProduct[8] = 10; drProduct[9] = "1"; ProductsTable.Rows.Add(drProduct);
इस Code में हमने सबसे पहले निम्नानुसार Statement द्वारा अपने ProductsTable नाम के DataTable Object में एक नया Row Add करने के लिए drProduct नाम का DataRow Object Create किया है:
DataRow drProduct = ProductsTable.NewRow();
और निम्नानुसार तरीके से Column के नाम को Specify करते हुए Newly Create होने वाले Row के Column Position पर Data Assign किया है:
// Fill values in Newly created DataRow Columns or Fields using ColumnName drProduct["ProductName"] = "Tea"; drProduct["SupplierID"] = 1; drProduct["CategoryID"] = 1; drProduct["QuantityPerUnit"] = 10; drProduct["UnitPrice"] = 20; drProduct["UnitsInStock"] = 50; drProduct["UnitsOnOrder"] = 5; drProduct["ReorderLevel"] = 10; drProduct["Discontinued"] = "1";
जबकि Newly Create होने वाले Row के सभी Columns में Appropriate Data Assign करने के बाद अन्त में इस Row को निम्न Statement द्वारा अपने DataTable में Append किया है:
ProductsTable.Rows.Add(drProduct);
ठीक इसी तरह से हमने एक और Row Create किया है, लेकिन इस नए Row के सभी Columns को Data Assign करने के लिए इस बार हमने DataTable के Columns का नाम Specify करने के स्थान पर उसकी Index Position यानी Ordinal का प्रयोग किया है। परिणामस्वरूप हमारा अगला Row DataTable में कुछ निम्नानुसार Create व Data से Fill होकर Append होता है:
// Add 1 more row to the Products DataTable. drProduct = ProductsTable.NewRow(); // Column 0 is the auto-incremented ID field, so start at 1 and // Fill values in Newly created DataRow Columns or Fields using Column Indexer drProduct[1] = "Coffee"; drProduct[2] = 1; drProduct[3] = 1; drProduct[4] = 10; drProduct[5] = 20; drProduct[6] = 50; drProduct[7] = 5; drProduct[8] = 10; drProduct[9] = "1"; ProductsTable.Rows.Add(drProduct);
हम देख सकते हैं कि दोनों ही तरीके के Codes में हमने Primary Key Column को Value Assign नहीं किया है, क्योंकि Primary Key Column को हमने AutoIncrement Property Set किया है। जिसकी वजह से हर नए Create होने वाले Row का Primary Key Automatically Generate होकर Row के Primary Key Column के रूप में Initialize हो जाता है, जिससे इसे अलग से Assign करने की जरूरत नहीं रहती।
हम इन दोनों में से किसी भी तरीके का प्रयोग करके Newly Create होने वाले DataRow Object के Columns को Data से Fill कर सकते हैं, लेकिन यदि हम गलत Index Number या Column Name का प्रयोग करें, तो दोनों ही स्थितियों में एक Runtime Exception Trigger होता है।
हालांकि जिस तरह से हमने DataRow Create करके mijksDrkuqlkj उसे Value से Fill किया है, उसी तरह से हम हमारी जरूरत के अनुसार और भी Rows Create कर सकते हैं और उसे Value से Fill कर सकते हैं। लेकिन Row Create करने के बावजूद अभी भी हमारा DataTable हमारे DataSet Object का हिस्सा नहीं है।
इसलिए इससे पहले कि हम हमारे Products DataTable को अपने DataSet Object में Insert करें, हमें हमारे सभी Rows के लिए Available RowState Properties को Check कर लेना चाहिए, ताकि किसी भी प्रकार की Error होने की स्थिति में उसे Resolve करने के बाद ही DataTable Object को DataSet में Insert किया जाए।
RowState Property in Detail
RowState Property उस स्थिति में बहुत उपयोगी साबित होता है, जब हमें Programmatically इस बात का पता लगाना होता है कि किसी DataTable की किन Rows की Original Values को नया Row Insert करके या Row के Data को Modify करके या Row को Deletion के लिए Mark करके Change किया गया है। इस Property को हम DataRowState Enumeration में Specified विभिन्न Values में से किसी भी Value से Set कर सकते हैं, जो कि निम्नानुसार है:
Added Value
जब किसी नए DataRow Object को DataRowCollection Property में Add किया जाता है लेकिन AcceptChanges() Method को Call नहीं किया गया होता, तब DataRow Object की RowState Property में Added मान होता है।
Deleted Value
जब किसी DataRow Object को Delete() Method का प्रयोग करके Deletion के लिए Mark किया गया होता है लेकिन AcceptChanges() Method को Call नहीं किया गया होता, तब DataRow Object की RowState Property में Deleted मान होता है।
Detached Value
जब किसी DataRow Object को Create तो किया गया होता है, लेकिन वह Row किसी DataTable के DataRowCollection Property का हिस्सा नहीं होता, यानी उस Row को किसी DataTable में Add() Method का प्रयोग करके Add नहीं किया गया होता, तब ml DataRow Object की RowState Property में Detached मान होता है। जब किसी DataRow Object को DataRowCollection से Remove कर दिया गया होता है, तब भी उस DataRow Object की RowState Property में यही मान होता है।
Modified Value
जब किसी DataRow Object के Data को Change तो किया गया होता है लेकिन AcceptChanges() Method को Call नहीं किया गया होता, तब DataRow Object की RowState Property में Modified मान होता है।
Unchanged Value
जब किसी DataRow Object के Data को अन्तिम बार AcceptChanges() Method को Call के बाद Change नहीं किया गया होता, तब DataRow Object की RowState Property में Unchanged मान होता है।
जब हम किसी DataTable Object की विभिन्न Rows को Programmatically Manipulate करते हैं, तब हर Row की RowState Property Automatically Set हो जाती है। इसे समझने के लिए हम निम्नानुसार एक Example Method Create कर सकते हैं:
private static void ManipulateDataRowState() { // Create a temp DataTable for testing. DataTable temp = new DataTable("Temp"); temp.Columns.Add(new DataColumn("TempColumn", typeof(int))); // RowState = Detached (i.e., not part of a DataTable yet). DataRow row = temp.NewRow(); Console.WriteLine("After calling NewRow(): {0}", row.RowState); // RowState = Added. temp.Rows.Add(row); Console.WriteLine("After calling Rows.Add(): {0}", row.RowState); // RowState = Added. row["TempColumn"] = 10; Console.WriteLine("After first assignment: {0}", row.RowState); // RowState = Unchanged. temp.AcceptChanges(); Console.WriteLine("After calling AcceptChanges: {0}", row.RowState); // RowState = Modified. row["TempColumn"] = 11; Console.WriteLine("After first assignment: {0}", row.RowState); // RowState = Deleted. temp.Rows[0].Delete(); Console.WriteLine("After calling Delete: {0}", row.RowState); }
इस Method में हमने सबसे पहले निम्नानुसार Code द्वारा एक DataTable Object Create किया है और इस DataTable Object के Schema में TempColumn नाम का केवल एक Integer Type का Column Create करके Add किया है, ताकि हम इस DataTable में Rows के साथ विभिन्न प्रकार के Interaction करने पर Update होने वाली उनकी RowState Property को Examine कर सकें:
DataTable temp = new DataTable(“Temp”);
temp.Columns.Add(new DataColumn(“TempColumn”, typeof(int)));
DataTable Object Create करने के बाद हमने निम्न Statements द्वारा row नाम का एक नया DataRow Create किया है:
// RowState = Detached (i.e., not part of a DataTable yet).
DataRow row = temp.NewRow();
Console.WriteLine(“After calling NewRow(): {0}”, row.RowState);
चूंकि ये Row अभी हमारे DataTable का हिस्सा नहीं है, इसलिए जब ये Code Run होता है, तो Output में हमें “Detached” मान दिखाई देता है। लेकिन जब इसी row Object को हम निम्नानुसार Statement द्वारा अपने temp नाम के DataTable में Add कर देते हैं:
// RowState = Added.
temp.Rows.Add(row);
Console.WriteLine(“After calling Rows.Add(): {0}”, row.RowState);
तो इस Code के Run होने पर इस बार हमें हमारे Add होने वाले Row की RowState Property का मान “Added” दिखाई देता है, क्योंकि उपरोक्त Code द्वारा इस बार हमारा Row हमारे temp नाम के DataTable में Add हो चुका है। इस Code के Run होने के बाद जब निम्न Code Run होता है:
// RowState = Added.
row[“TempColumn”] = 10;
Console.WriteLine(“After first assignment: {0}”, row.RowState);
तो इस Code के Run होने पर भी हमें row Object की RowState Property का मान “Added” ही दिखाई देता है। लेकिन अगले Statement द्वारा जब इस Row में किए गए Changes को Accept कर लिया जाता है:
// RowState = Unchanged.
temp.AcceptChanges();
Console.WriteLine(“After calling AcceptChanges: {0}”, row.RowState);
उसके बाद जब हम इस Row की RowState Property को Display करते हैं, तो हमें “Unchanged” मान दिखाई देता है। क्योंकि Row में किए गए Changes को Accept करने के बाद इसमें किसी भी तरह का Change नहीं किया गया है। लेकिन जब हम निम्नानुसार Statements द्वारा Row के Data के मान को Modify करते हैं:
// RowState = Modified.
row[“TempColumn”] = 11;
Console.WriteLine(“After first assignment: {0}”, row.RowState);
तो इस बार हमें हमारे DataRow Object के RowState Property का मान “Modified” दिखाई देता है, क्योंकि हमने हमारे Row के Data को 10 से Change करके 11 कर दिया है। जबकि अन्त में जब निम्न Codes Execute होते हैं:
// RowState = Deleted.
temp.Rows[0].Delete();
Console.WriteLine(“After calling Delete: {0}”, row.RowState);
तो Delete() Method का प्रयोग करके Row को Deletion के लिए Mark किए जाने की वजह से इस बार हमें हमारे Row की RowState Property का मान “Deleted” दिखाई पडता है।
इस तरह से हम जैसे ही किसी Row के साथ किसी प्रकार का Operation Perform करते हैं, उस Row की RowState Property उस Operation को Added, Detached, Deleted, Modified या Unchanged मानों के माध्यम से Reflect करने लगता है।
परिणामस्वरूप जब DataSet Object या DataTable Object के Data को Permanently Save करने के लिए Underlying Database पर Send करना होता है, तो DataSet या DataTable Object को इस RowState Property के माध्यम से पता होता है कि उसे किन Rows को Underlying Database पर Save होने के लिए Send करना है।
जिसकी वजह से सारे Data के स्थान पर केवल नए Add किए गए Data या Modify किए गए Data को ही Underlying Database पर Send किया जाता है। फलस्वरूप Network का Traffic Flow कम होता है और हमारे Application की Performance Increase होती है।
DataRowVersion Property in Detail
RowState Property के माध्यम से Row की Current State को Maintain करने के साथ ही DataRow Object DataRowVersion Property के माध्यम से Row के Data के तीन Possible Versions को भी Maintain करता है। जब कोई DataRow Object Construct होता है, तो उसमें Data की एक Single Copy होती है, जो कि Data के Current Version को Represent करता है।
लेकिन जब हम DataRow Object को विभिन्न प्रकार के Method Call करके Programmatically Manipulate करते हैं, तो उसी DataRow के कुछ अन्य Additional Versions Create होते है। इन Additional Versions को Access करने के लिए हम DataRowVersion Property को DataRowVersion Enumeration में Specified निम्नानुसार चार में से किसी एक मान से Set कर सकते हैं:
Current
DataRowVersion Property में इस Value के Set होने पर Row की Current Values Show होती हैं, भले ही उस Row के Data को Change ही क्यों न किया गया हो।
Default
ये मान DataRowState का Default Version होता है। RowState Property में Added, Modified या Deleted मान के Set होने पर Default मान Current होता है, जबकि Detached मान के Set होने पर Default मान Proposed होता है।
Original
DataRowVersion Property में इस Value के Set होने पर Row वे Values Show होती हैं, जो AcceptChanges() Method के Last Time Call होने पर Row में Stored थीं अथवा जब DataRow में Value को First Time Insert किया गया था, तब जो Values Stored थीं।
Proposed
DataRowVersion Property में इस Value के Set होने पर Row की BeginEdit() Method Call के माध्यम से Currently Edit हो रही Values होती हैं।
जैसाकि हम समझ सकते हैं कि DataRowVersion Property की Values कुछ स्थितियों में DataRowState Property की Values पर आधारित होती हैं, जिसे हम निम्नानुसार समझ सकते हैं:
- यदि हम BeginEdit() Method Call करते हैं और Row की Value को Change करते हैं, तो Current व Proposed Values Available हो जाती हैं।
- यदि हम CancelEdit() Method Call करते हैं, तो Proposed Value Delete हो जाती है।
- EndEdit() Method Call करने के बाद Proposed Value, Current Value बन जाती है।
- AcceptChanges() Method को Call करने के बाद Original Value, Current Value के Identical हो जाती है और यही Transformation तब होता है, जब हम DataTable.AcceptChanges() Method को Call करते हैं।
- RejectChanges() Method को Call करने पर Proposed Value Discard हो जाती है और Row Current Version का बन जाता है।
हालांकि इस प्रक्रिया को समझना थोडा मुश्किल है। लेकिन DataRowVersion Property के माध्यम से एक ही Row के तीन Versions को Maintain करने की वजह से ही Frontend User द्वारा Data में किए गए Changes को Rollback करके फिर से पिछली Commit वाली स्थिति के Data को प्राप्त करना सम्भव हो पाता है।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF