What is a Data Table: DataTable Type भी कई Properties and Methods Define करता है, जिनमें से ज्यादातर का नाम DataSet Object के Members के समान ही होता है। लेकिन फिर भी DataTable Object भी कुछ Special Members Define करता है, जिन्हें Specific Type की Requirements को पूरा करने के लिए Use किया जा सकता है।
DataTable Members
Rows व Columns से सम्बंधित Members को छोडकर DataTable के कुछ Core Members का Description निम्नानुसार है:
CaseSensitive Property
ये Property इस बात को Indicate करता है कि DataTable के String Data का Case Sensitive तरीके से Comparision हो सकता है या नहीं। इस Property का Default मान false होता है।
ChildRelations Property
यदि कोई Child Relation Available हो, तो ये Property DataTable के Child Relations के Collection को Return करता है।
Constraints Property
ये Property Table द्वारा Maintained Constraints के Collection को Get करता है।
Copy() Method
ये Method Specified DataTable के Schema with Data को एक नए Instance में Copy करता है।
DataSet Property
ये Property उस DataSet को Get करता है, जिसमें DataTable Contained होता है।
DefaultView Property
ये Property Table के एक Customized View को Get करता है, जिसमें Data का किसी Condition के आधार पर Filtered View या Cursor Position Data के रूप में हो सकता है।
ParentRelations Property
ये Property Current DataTable के लिए Parent Relations के Collection को Get करता है।
PrimaryKey Property
ये Property Columns के एक Array को Get/Set करता है जो कि DataTable के लिए Primary Key के रूप में काम करता है।
TableName Property
ये Property Table Name को Get/Set करता है। इस Property को Constructor Parameter के माध्यम से भी Specify किया जा सकता है।
Current Example को ही आगे बढाते हुए हम हमारे DataTable के ProductID DataColumn को PrimaryKey Property Set कर सकते हैं। यहां ध्यान देने वाली बात ये है कि PrimaryKey Property को DataColumn Objects का Collection Assign किया जाता है, जिसमें कई DataColumns को Specify किया जा सकता है।
इसलिए यदि हमें Composite Primary Key Specify करना हो, तो Primary Key के रूप में Participate करने वाले सभी DataColumns को इस एक DataColumn Array के रूप में PrimaryKey Property को Assign करना होता है।
हालांकि हम केवल ProductID DataColumn को ही Primary Key Setup करना चाहते हैं, इसलिए हमें हमारे DataColumn Array में निम्नानुसार केवल इसी Column को Specify करना होगा, जो कि हमारे DataTable का First Column है:
// Mark the primary key of this table.
ProductsTable.PrimaryKey = new DataColumn[] { ProductsTable.Columns[0] };
चूंकि हमारे Products DataTable का First Column ही ProductID Column है, जिसके साथ Primary Key Set करना है और इस Column को Indexer के माध्यम से Access करते समय हमें Index Number 0 Use करना होता है। इसीलिए अपने DataTable के Columns Collection के Ordinal Position 0 वाले Column को Primary के रूप में Assign किया है, जो कि ProductID Column को Represent करता है।
Inserting DataTables into DataSet Object
पिछले Section तक जब हम हमारा काम कर लेते हैं, यानी हम DataColumns के माध्यम से DataTable का Structure Define कर लेते हैं और DataTable में Data Insert करने के लिए DataRows Create कर लेते हैं, तो एक प्रकार से हमारी DataTable पूरी तरह से तैयार हो जाती है, जो इस स्थिति में होती है कि हम उसे अपने DataSet Object में Insert कर सकें।
हालांकि यदि हम चाहें तो DataTable को बिना DataSet object में Insert किए हुए भी स्वतं= रूप से उपयोग में ले सकते हैं, लेकिन चूंकि DataTable केवल एक Single Table को ही Represent करता है, इसलिए यदि हम इसे DataSet Object में Insert नहीं करते, तो हम विभिन्न Tables के बीच Relationship Maintain नहीं कर सकते। इसलिए सामान्यत: जब हमें केवल एक Single Table के साथ प्रक्रिया करनी होती है, तब हम DataSet Object को Ignore करते हुए केवल DataTable Object के माध्यम से ही अपनी जरूरतों को पूरा कर सकते हैं।
लेकिन जब हमें ऐसे Environment में काम करना होता है, जहां एक से ज्यादा DataTables के बीच Relationship को Maintain करते हुए Application Develop करना होता है, तब Create किए जाने वाले विभिन्न DataTables को DataSet Object में Insert करना जरूरी होता है और इस जरूरत को पूरा करने के लिए हमें अपने DataSet Object की Tables नाम की Collection Property में अपनी सभी DataTables को निम्नानुसार Add करना होता है:
// Finally, add our table to the DataSet.
ds.Tables.Add(ProductsTable);
अब यदि हम हमारे Main() Method को Update करते हुए उसमें FillDataSet() Method को Call करें जिसमें Parameter के रूप में DataSet Object को Pass किया गया हो, तो हमारा Main() Method कुछ निम्नानुसार होगा, जबकि DataSet Object में Contained DataTables के Data को Display करने के लिए हमने PrintDataSet() Method को भी Call किया है, जिसे आगे Define करेंगे-
static void Main(string[] args) { // Create the DataSet object and add a few properties. DataSet dsNorthwind = new DataSet("Northwindh"); dsNorthwind.ExtendedProperties["TimeStamp"] = DateTime.Now; dsNorthwind.ExtendedProperties["DataSetID"] = Guid.NewGuid(); dsNorthwind.ExtendedProperties["Company"] = "BccFalna.com"; FillDataSet(dsNorthwind); PrintDataSet(dsNorthwind); }
जबकि इस Chapter में Discuss किए गए सभी Concepts के आधार पर Implement किया गया हमारा FillDataSet() Method निम्नानुसार कुछ निम्नानुसार है:
static void FillDataSet(DataSet ds) { // Create data columns that map to the "real" columns // in the Products table of the Northwind database. DataColumn pProductID = new DataColumn("ProductID", typeof(int)); pProductID.Caption = "Product ID"; pProductID.ReadOnly = true; pProductID.AllowDBNull = false; pProductID.Unique = true; pProductID.AutoIncrement = true; pProductID.AutoIncrementSeed = 0; pProductID.AutoIncrementStep = 1; DataColumn pProductName = new DataColumn("ProductName", typeof(string)); pProductName.Caption = "Product Name"; DataColumn pSupplierID = new DataColumn("SupplierID", typeof(int)); pSupplierID.Caption = "Supplier ID"; DataColumn pCategoryID = new DataColumn("CategoryID", typeof(int)); pCategoryID.Caption = "Category ID"; DataColumn pQuantityPerUnit = new DataColumn("QuantityPerUnit", typeof(int)); pQuantityPerUnit.Caption = "Quantity/Unit"; DataColumn pUnitPrice = new DataColumn("UnitPrice", typeof(float)); pUnitPrice.Caption = "Unit Price"; DataColumn pUnitsInStock = new DataColumn("UnitsInStock", typeof(int)); pUnitPrice.Caption = "Units in Stock"; DataColumn pUnitsOnOrder = new DataColumn("UnitsOnOrder", typeof(int)); pUnitsOnOrder.Caption = "Ordered Units"; DataColumn pReorderLevel = new DataColumn("ReorderLevel", typeof(int)); pReorderLevel.Caption = "Reorder Level"; DataColumn pDiscontinued = new DataColumn("Discontinued", typeof(string)); // Now add DataColumns to a DataTable. DataTable ProductsTable = new DataTable("Products"); ProductsTable.Columns.AddRange(new DataColumn[] { pProductID, pProductName, pSupplierID, pCategoryID, pQuantityPerUnit, pUnitPrice, pUnitsInStock, pUnitsOnOrder, pReorderLevel, pDiscontinued }); // Mark the primary key of this table. ProductsTable.PrimaryKey = new DataColumn[] { ProductsTable.Columns[0] }; // 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); // Finally, add our table to the DataSet. ds.Tables.Add(ProductsTable); }
Obtaining Data in DataSet Object
क्योंकि DataSet Object विभिन्न DataTable Objects का Container मात्र होता है और Actual Data हमेंशा DataTables में ही Contained होता है। इसलिए हम एक ऐसा Method Create कर सकते हैं, जो हमारे DataSet Object की ExtendedProperties Collection सहित Metadata व विभिन्न DataTable के Data को Iterate करे तथा Column Names व Row Values को Type Indexers के माध्यम से Output में Print करे।
static void PrintDataSet(DataSet ds) { // Print out the DataSet name and any extended properties. Console.WriteLine("DataSet is named: {0}", ds.DataSetName); foreach (System.Collections.DictionaryEntry de in ds.ExtendedProperties) { Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); } Console.WriteLine(); // Print out each table. foreach (DataTable dt in ds.Tables) { Console.WriteLine("=> {0} Table:", dt.TableName); // Print out the column names. for (int curCol = 0; curCol < dt.Columns.Count; curCol++) { Console.Write(dt.Columns[curCol].ColumnName + "\t"); } Console.WriteLine("\n-------------------------------------------------------------------------------"); // Print the DataTable. for (int curRow = 0; curRow < dt.Rows.Count; curRow++) { for (int curCol = 0; curCol < dt.Columns.Count; curCol++) { Console.Write(dt.Rows[curRow][curCol].ToString() + "\t"); } Console.WriteLine(); } } }
जब हम इस PrintDataSet() Method को उपरोक्तानुसार Define करके पूरे Program को Run करते हैं, तो हमें प्राप्त होने वाला Output निम्न चित्रानुसार होता है, जिसमें न केवल हमें हमारे Northwind DataSet के साथ Associate किए गए ExtendedProperties के विभिन्न मान दिखाई दे रहे हैं, बल्कि हमें हमारी Products DataTable के हर Column व हर Row का मान भी दिखाई दे रहा है:
Processing DataTable Data Using DataTableReader Object
Connected Layer में हम DataReader Object के माध्यम से Table के Data को Process करते हैं जबकि Disconnected Layer में हम DataSet Object के माध्यम से Data को Process करते हैं। हम समझ सकते हैं कि दोनों ही तरह से Data को Process करने के तरीके में काफी अन्तर है।
जब हम Connected Layer को Use कर रहे होते हैं, तब हमें एक while Loop में Read() Method को Call करते हुए Name/Value Pair के रूप में Underlying Database की Table के Data को Access करना होता है। जबकि DataSet Object का प्रयोग करते हुए Disconnected Mode में हमें DataSet Object में Contained DataTable Object के Rows व Columns को Process करना होता है।
DataTable Object CreateDataReader() नाम का एक Method Support करता है। ये Method हमें किसी DataTable Object के Data को प्राप्त करने के लिए DataReader जैसे Navigation Scheme को Use करने की सुविधा Provide करता है। लेकिन अब Create होने वाला DataReader Underlying Database से Data को Access नहीं करता बल्कि DataSet Object में Contained IN-Memory DataTables के Data को Access करता है। इसलिए हमें Underlying Database के साथ किसी प्रकार का Connection Establish करने की जरूरत नहीं होती।
इस Approach को Use करने का सबसे बडा फायदा ये है कि हम एक Single Model को Use करते हुए Data Manipulation कर सकते हैं, जबकि इस बात से कोई फर्क नहीं पडता कि हम हमारा Frontend Client Application Develop करने के लिए ADO.NET के Connected Layer के Objects को Use कर रहे हैं या Disconnected Layer के Objects को। इस प्रक्रिया को समझने के लिए हम निम्नानुसार एक और Method Create कर सकते है:
static void PrintTable(DataTable dt) { // Get the DataTableReader type. DataTableReader dtReader = dt.CreateDataReader(); // The DataTableReader works just like the DataReader. while (dtReader.Read()) { for (int i = 0; i < dtReader.FieldCount; i++) { Console.Write("{0}\t", dtReader.GetValue(i).ToString().Trim()); } Console.WriteLine(); } dtReader.Close(); }
हम देख सकते हैं कि इस Method के Code में DataTableReader Object Exactly उसी तरह से काम कर रहा है, जिस तरह से हमारे Data Provider का DataReader Object करता है। DataTableReader Object उस समय काफी उपयोगी व Efficient होता है, जब हमें बिना Rows व Columns Collection में Traversing किए हुए किसी DataTable में Data को तेजी से Fill करना होता है। अब मानलो कि हम हमारे PrintDataSet() Method को इस DataTableReader Object को Use करते हुए Modify करना चाहें, तो हमारा Modified Method कुछ निम्नानुसार बन सकता है:
static void PrintDataSet(DataSet ds) { // Print out the DataSet name and any extended properties. Console.WriteLine("DataSet is named: {0}", ds.DataSetName); foreach (System.Collections.DictionaryEntry de in ds.ExtendedProperties) { Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); } Console.WriteLine(); // Print out each table. foreach (DataTable dt in ds.Tables) { Console.WriteLine("=> {0} Table:", dt.TableName); // Print out the column names. for (int curCol = 0; curCol < dt.Columns.Count; curCol++) { Console.Write(dt.Columns[curCol].ColumnName + "\t"); } Console.WriteLine("\n-------------------------------------------------------------------------------"); // Print the DataTable using our new helper method. PrintTable(dt); } }
यदि हम इस Modified Method को Run करते हैं, तो भी हमारे Output पर कोई प्रभाव नहीं पडता। हालांकि हमारा PrintDataSet() नाम का Method अब पहले की तुलना में कम Typical है, क्योंकि हमने DataTable के Data को Display करने के लिए PrintTable() Method को Use कर लिया है न कि Table के Rows व Columns Collection को।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF