C# In Memory Database: यदि हम DataSet को एक In-Memory Mini-RDBMS मानें, तो DataTable को इस Database की Tables का Closest Logical Equivalent मान सकते हैं। ज्यादातर Databases Foreign-Key Constraints के माध्यम से दो Tables के बीच Relationship व Integrity Constraints को Set करने की सुविधा भी Provide करते हैं।
जैसाकि हमने पहले Discuss किया था कि DataSet Object में Tables (DataTableCollection) व Relations (DataRelationCollection) का Collection होता है। अत: DataSet को Tables व Relations के Collection के रूप में भी Refer किया जा सकता है। जबकि किसी DataSet Object में Exist Tables व Relations की Minimum संख्या Zero हो सकती है।
Relations Collection
DataSet.Relations Property, DataRelationCollection Class का एक Instance होता है, जिसमें DataRelation Objects Contained होते हैं। इन DataRelation Objects का प्रयोग, किसी DataSet की दो DataTables के बीच Parent-Child Relationship Create करने के लिए किया जाता है। इस प्रकार की Relationship को Primary-Key व Foreign-Key Relationship के रूप में Represent किया जा सकता है।
किसी DataSet Object की दो DataTables के बीच Relationship Create करने के लिए हम DataSet.Relations.Add() Method को Use करते हैं, जहां Add() Method के निम्नानुसार कई Overloaded Versions Exist हैं:
Add(DataRelation)
ये Version, Collection में Specified DataRelation Object को Add करता है।
Add(DataRelation, DataColumn)
ये Version, दो DataColumns के आधार पर Collection में एक नया DataRelation Object Create करता है। जहां पहला Argument, Parent Column को Represent करता है तथा दूसरा Argument Child Column को, जबकि DataRelation को एक Default नाम Specify कर दिया जाता है।
Add(DataColumn[], DataColumn[])
ये Version, दो DataColumn Array के आधार पर Collection में एक नया DataRelation Object Create करता है। जहां पहला Argument, Parent Column Array को Represent करता है तथा दूसरा Argument Child Column Array को, जबकि DataRelation को एक Default नाम Specify कर दिया जाता है।
Add(String, DataColumn, DataColumn)
ये Version, DataRelation की तरह String के रूप में Specified DataRelation के नाम का DataRelation Object Create करता है, जिसे DataRelation.RelationName Property द्वारा Access किया जा सकता है। जबकि दूसरे DataColumn Argument के रूप में Parent Column को Specify किया जाता है जबकि तीसरे DataColumn Argument के रूप में Child Column को।
Add(String, DataColumn[], DataColumn[])
ये Version, DataRelation की तरह String के रूप में Specified DataRelation के नाम का DataRelation Object Create करता है, जिसे DataRelation.RelationName Property द्वारा Access किया जा सकता है। जबकि दूसरे DataColumn Argument के रूप में Parent Column Array को Specify किया जाता है जबकि तीसरे DataColumn Argument के रूप में Child Column Array को।
Add(String, DataColumn, DataColumn, Boolean)
ये Version, DataRelation की तरह String के रूप में Specified DataRelation के नाम का DataRelation Object Create करता है, जिसे DataRelation.RelationName Property द्वारा Access किया जा सकता है। जबकि दूसरे DataColumn Argument के रूप में Parent Column को Specify किया जाता है तथा तीसरे DataColumn Argument के रूप में Child Column को। चौथा Argument एक Boolean मान है जो इस बात को Specify करता है कि Constraint Create करना है या नहीं। जबकि इसका Default मान True होता है, जो इस बात का Indication है कि Constraint Create करना है।
Add(String, DataColumn, DataColumn, Boolean)
ये Version, DataRelation की तरह String के रूप में Specified DataRelation के नाम का DataRelation Object Create करता है, जिसे DataRelation.RelationName Property द्वारा Access किया जा सकता है। जबकि दूसरे DataColumn Argument के रूप में Parent Column Array को Specify किया जाता है तथा तीसरे DataColumn Argument के रूप में Child Column Array को। यहां भी चौथा Argument एक Boolean मान है जो इस बात को Specify करता है कि Constraint Create करना है या नहीं। जबकि इसका Default मान True होता है, जो इस बात का Indication है कि Constraint Create करना है।
Working with DataSet Object
हम उपरोक्त में से किसी भी Overloaded Version के Add() Method को Use करते हुए DataSet में दो Tables के बीच Relationship Set कर सकते हैं। उदाहरण के लिए आगे दिया गया Code Segment एक String के रूप में Relation Name को पहले Parameter की तरह Accept कर रहा है जबकि अन्य दो Parameters, Parent व Child Columns को Refer कर रहे हैं:
//Create relation between Customers and Orders invoiceDataSet.Relations.Add ( "Customers2Orders", //DataRelation Name invoiceDataSet.Tables["Customers"].Columns["CustomerID"], //Parent Column invoiceDataSet.Tables["Orders"].Columns["CustomerID"], //Child Column );
ये Code सबसे invoiceDataSet.Relations Object के लिए Add() Method को Invoke करता है और invoiceDataSet.Relations Collection में एक नया DataRelation Object Create करता है। परिणामस्वरूप Customer DataTable में एक नया UniqueConstraint Add हो जाता है जबकि Orders Table में एक नया ForeignKeyConstraint Add हो जाता है।
UniqueConstraint इस बात का ध्यान रखता है कि Table में सभी Parent Column Values Unique रहें जबकि ForeignKeyConstraint इस बात को निि”चत करता है, Orders Table में कभी भी कोई Invalid यानी ऐसी Value Appear न हो, जो कि Parent Table यानी Customers Table में Exist न हो।
Default रूप से ये Code Customers से Orders Records के बीच Cascading Deletion व Updating को भी Setup कर देता है। परिणामस्वरूप यदि Customers Table से किसी Customer के Record को Delete किया जाता है, तो उसने जो भी Orders Place किए हैं, वे सभी Orders भी Automatically Delete हो जाते हैं।
उपरोक्त Code में DataRelation Object Automatically Create होता है। जबकि DataRelation Object को Explicitly Construct करना भी सम्भव है, जिसे हम बाद में Relations Collection में Add कर सकते हैं। जैसे:
//Create two DataColumns Object Reference DataColumn parentColumn; DataColumn childColumn; //Setup these DataColumns with Parent and Child Columns references parentColumn = invoiceDataSet.Tables["Customers"].Columns["CustomerID"]; childColumn = invoiceDataSet.Tables["Orders"].Columns["CustomerID"]; //Create new DataRelation Object DataRelation customers2Orders = new DataRelation ("Customers2Orders", parentColumn, childColumn); //Adding DataRelation Object to DataSet.Relations Collection invoiceDataSet.Relations.Add(customers2Orders);
इतना ही नहीं, जैसाकि Add() Method के Versions में हमने Describe किया था, हम Parent व Child Tables के लिए DataColumns के Array को भी Setup कर सकते हैं।
उदाहरण के लिए मानलो कि Invoice Management System के Database में Managers व Employees Tables है और Employees नाम की Table में जो Records हैं, उन में से कुछ Employees ऐसे भी हैं, जो स्वयं Manager भी हैं। इस वजह हम ये मान रहे हैं कि इस प्रकार के Employees की Information Employees व Managers दोनों Table में Duplicated Form में है।
इस प्रकार की Relationship को Represent करने के लिए हम DataColumns के Array का प्रयोग करते हुए निम्नानुसार Code लिख सकते हैं:
//Create arrays of DataColumns for the relevant columns DataColumn[] parentArray = new DataColumn[2]; parentArray[0] = invoiceDataSet.Tables["Employees"].Columns["fname"]; parentArray[1] = invoiceDataSet.Tables["Employees"].Columns["lname"]; DataColumn[] childArray = new DataColumn[2]; childArray[0] = invoiceDataSet.Tables["Managers"].Columns["fname"]; childArray[1] = invoiceDataSet.Tables["Managers"].Columns["lname"]; DataRelation emp2Mngr = new DataRelation("Employees2Managers", parentArray, childArray); invoiceDataSet.Relations.Add(emp2Mngr);
इस प्रकार से अभी तक के सारे Discussion के दौरान हमने DataSet Object के विभिन्न Parts DataTables, DataRelations व Constraints के बारे में Detail से समझा और ये जाना कि किस तरह से हम ADO.NET Architecture का प्रयोग करते हुए एक In-Memory Mini RDBMS Create कर सकते हैं, जबकि इस RDBMS के लिए हमें Actual RDBMS Database की जरूरत नहीं है।
अन्य शब्दों में कहें तो इस Chapter में Discuss किए गए किसी भी Object का किसी भी Particular Data Source से कोई Direct सम्बंध नहीं है। इसलिए इन DataSet Object के इन विभिन्न Parts को Specify करके हम जो In-Memory RDBMS Create करते हैं, OracleClient या SqlClient जैसे Specific Data Provider भी अपने DataSet Object को Exactly इसी प्रकार से Implement करते हैं।
यानी जिस तरह से इस Chapter में Discuss किए गए DataSet Object के विभिन्न Parts पूरी तरह से Disconnected Mode में Create होते है, जिनका Underlying Data Source से कोई Direct सम्बंध नहीं होता, OracleClient व SqlClient के DataSet Object के विभिन्न Parts भी ठीक इसी तरह से Disconnected Mode में Create होते हैं, जिनका उनके Underlying Data Source से कोई Direct सम्बंध नहीं होता।
उपरोक्त पूरे Discussion के आधार पर हम अग्रानुसार एक GUI Application Program Create कर सकते हैं, जिसमें दो DataGridView Objects को DataSet Object के साथ Connect किया गया है और दोनों DataGridView Controls के माध्यम से Primary-Key व Foreign-Key को Maintain करते हुए हम इन DataGridView Controls में Data को Insert करने योग्; बनाया गया है।
इस GUI Program में हमने Form पर एक Button Control लिया है, जिसे Click करते ही दोनों DataGridView Objects Working स्थिति में आने के लिए DataSet Object के माध्यम से Setup हो जाते हैं, जबकि दोनों DataGridView Controls आपस में Primary-Key व Foreign-Key के माध्यम से Connected हैं।
यानी इन दोनों DataGridView Controls में पहला Control, Parent DataTable को Represent कर रहा है जबकि दूसरा DataGridView Control, Child DataTable को Represent कर रहा है। हमारे उदाहरण Program के GUI Form को निम्न चित्रानुसार Represent कर सकते हैं:

इस Form को Design करने के बाद इस Form के लिए Code Window में निम्नानुसार Code लिख सकते हैं:
using System; using System.Data; using System.Windows.Forms; namespace DataSetDBApp { public partial class frmDataSetWorking : Form { public frmDataSetWorking() { InitializeComponent(); } private void btnSetupDataSet_Click(object sender, EventArgs e) { //Customer DataTable Creation DataTable tblCustomer = new DataTable("Customer"); DataColumn dcName; //ID DataColumn creation for Customer DataTable dcName = new DataColumn("CustomerID", typeof(System.Int32)); dcName.AutoIncrement = true; tblCustomer.Columns.Add(dcName); //First Name DataColumn creation for Customer DataTable dcName = new DataColumn("FName", typeof(System.String)); tblCustomer.Columns.Add(dcName); //Last Name DataColumn creation for Customer DataTable dcName = new DataColumn("LName", typeof(System.String)); tblCustomer.Columns.Add(dcName); //Orders DataTable Creation DataTable tblOrder = new DataTable("Orders"); //ID DataColumn creation for Order DataTable dcName = new DataColumn("OrderID", typeof(System.Int32)); dcName.AutoIncrement = true; tblOrder.Columns.Add(dcName); //CustomerID DataColumn creation for Order DataTable as Foreign Key dcName = new DataColumn("CustomerID", typeof(System.Int32)); tblOrder.Columns.Add(dcName); //Item Name DataColumn creation for Order DataTable dcName = new DataColumn("ItemName", typeof(System.String)); tblOrder.Columns.Add(dcName); //DataSet Creation DataSet dsCustomer2Order = new DataSet("Customer2OrderDataSet"); dsCustomer2Order.Tables.Add(tblCustomer); dsCustomer2Order.Tables.Add(tblOrder); //Relationship Setup dsCustomer2Order.Relations.Add(new DataRelation("Customer2OrderRelation", tblCustomer.Columns["CustomerID"],tblOrder.Columns["CustomerID"])); dg4ParentDataTable.DataSource = dsCustomer2Order.Tables["Customer"]; dg4ChildDataTable.DataSource = dsCustomer2Order.Tables["Orders"]; } } }
इस Program के अन्तर्गत Form पर दिखाई देने वाले Button का नाम btnSetupDataSet है जबकि दोनों DataGridView Controls का नाम dg4ParentDataTabe व dg4ChildDataTable है।
इस Program को लिखने के बाद जब हम हमारे GUI Application को Run करते हैं और दिखाई देने वाले Form पर स्थित Button को Click करते हैं, तो यही Form हमें कुछ निम्नानुसार दिखाई देने लगता है:

इस प्रकार से हम DataSet Object का प्रयोग करके Disconnected Mode में भी एक In-Memory MINI-RDBMS Based Database Application Create कर सकते हैं, जो कि Exactly उसी प्रकार से काम करता है, जिस प्रकार से Actual RDBMS का Actual Database करता है।
यानी जिस तरह से किसी Actual RDBMS Software में Data Primary-Key व Foreign-Key से Connected Parent व Child Tables व्यवहार करते हैं, ठीक उसी तरह से उपरोक्तानुसार DataSet Object के विभिन्न हिस्सों का प्रयोग करते Create किए गए Logical Database में Specified Primary-Key व Foreign-Key भी काम करते हैं।
इसीलिए यदि हम उपरोक्त Form पर दिखाई देने वाले Order Table में किसी ऐसे CustomerID को Specify करें, जो कि Customer Table में Exist नहीं है, तो ये Program भी निम्न चित्रानुसार एक System.Data.InvalidConstraintException.ForeignKeyConstraint Exception Trigger करता है:

क्योंकि किसी भी Relational Database में यदि Master/Parent Table के Primary Key Column में कोई मान न हो, तो उसे Detail/Child Table के Foreign Key Column में भी Specify नहीं किया जा सकता।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF