Strongly Typed: इस पुस्तक में हमने Drag-and-Drop तकनीक का प्रयोग करके DataSet Object Create करने के Visual तरीके के बारे में भी विस्तार से Discuss किया था। उस तरीके के अन्तर्गत हमने सबसे पहले एक VIEW => Other Windows => Data Sources Option को Click करके दिखाई देने वाले Data Sources Sidebar में Wizard के माध्यम से नया DataSource Establish किया था और Create होने वाले DataSource की विभिन्न Tables को Drag-and-Drop तकनीक द्वारा Form पर Drag करके Automatically एक Working Form Create किया था। इस तकनीक के बारे में हमने Accessing Single Table Data with Visual Studio Section में विस्तार से Discuss किया था।
इस तरीके को Use करते समय हमने पहले Data Source Wizard को Use किया था और फिर Data Source Wizard के माध्यम से Create होने वाली Visual Table List में से विभिन्न Tables को DataGridView या Details View के रूप में Setup किया था। जबकि यदि हम चाहें तो किसी Data Binding Control को Form पर Place करने के बाद उस Particular Control में Data को Retrieve करने के लिए Drag-and-Drop की इसी समान तकनीक का प्रयोग करते हुए भी Design कर सकते हैं।
इस प्रक्रिया को बेहतर तरीके से समझने के लिए हम एक नया Windows Forms Application Create कर सकते हैं और दिखाई देने वाले Form पर एक DataGridView Control Place कर सकते हैं, क्योंकि DataGridView Control एक Data Binding Control है, जिसे किसी Underlying Database की किसी Table के Data के साथ Bind किया जा सकता है। जैसे ही हम Form पर DataGridView Control को Place करते हैं, निम्न चित्रानुसार एक Popup Display हो जाता है:
इस Popup Menu से उपरोक्त चित्र में दर्शाए अनुसार हम “Add Project Data Source…” Option पर Click करके अपने DataGridView Control के लिए Data Source Setup कर सकते हैं। इस Option को Click करते ही फिर से हमारे सामने वही “Data Source Configuration Wizard” Display हो जाता है, जो Accessing Single Table Data with Visual Studio Section में Display हुआ था:
यानी यदि हम चाहें, तो किसी भी Data Binding Control को Form पर Place करते ही उसके लिए Data Source को Setup कर सकते हैं। उदाहरण के लिए यदि हम हमारी Northwind Database की Orders Table के Data को इस Form पर दिखाई देने वाले DataGridView Control में Render करना चाहें, तो पूरा Wizard Follow करने के बाद हमारा Form हमें कुछ निम्न चित्रानुसार दिखाई देता है, जहां हम देख सकते हैं कि हमारे DataGridView Control के साथ नया Data Binding Control Setup हो गया है, जो हमारे DataGridView Control को Underlying Database की Orders Table के साथ Bind कर रहा है:
Understanding the App.config Configuration File
जब हम इस Wizard को Follow करते हैं, तो हमारे DataGridView Control से Underlying Database की Table को Bind करने के लिए Automatically एक App.config File भी Setup हो जाती है, जिसमें निम्नानुसार ConnectionString Configuration Information होती है:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> </configSections> <connectionStrings> <add name="STDataSet.Properties.Settings.NWConStr" connectionString="Data Source=KULDEEP\SQLSERVEREXPRESS;Initial Catalog=Northwind;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
यानी जब हम DataSource का प्रयोग करते हुए किसी Control को Bind करते हैं, तो उसके लिए Use होने वाली Connection Configuration सम्बंधित App.config File स्वयं ही Create व Maintain होती है।
हम देख सकते हैं कि इस File में Create होने वाली ConnectionString के साथ Associated Name “STDataSet.Properties.Settings.NWConStr” काफी बडा है। ये नाम वास्तव में Wizard द्वारा Generate होने वाले Strongly Typed DataSet के कारण ही इतना बडा है क्योंकि जब हम Data Source Wizard Use करते हैं, तो ये Wizard स्वयं ही एक Strongly Typed DataSet Object Create करता है।
ये Strongly Typed DataSet वास्तव में Underlying Database का एक Automatically Create होने वाला Disconnected Mode Objects का Set होता है, जो कि केवल उसी स्थिति में Create होता है, जब हम Visual Studio को अपने IDE के रूप में Use करते हैं और उसके Data Source Wizard का प्रयोग करते हैं अथवा DataSet Object को Manually Define करते हैं।
यानी Strongly Typed DataSet Object वास्तव में केवल Visual Studio का एक Extension मात्र है, जो हमें Rapid Application Develop करने के लिए विभिन्न जरूरी Objects को Wizard के माध्यम से स्वयं ही Create कर लेता है।
इसलिए इस App.config File में हमें जो Configuration दिखाई दे रहा है, वह पूरी तरह से इस Automatically Create होने वाले Strongly Typed DataSet Object के कारण ही दिखाई दे रहा है। क्योंकि Visual Studio हमारे Strongly Typed DataSet Object के आधार पर ही App.config File को Underlying Database से Connection Establish करने के लिए उपरोक्तानुसार Define कर रहा है।
Understanding the Strongly Typed DataSet
Configuration File के साथ ही Visual Studio का Data Source Wizard एक Strongly Typed DataSet भी Create करता है, जो कि एक Custom Class होता है। ये Custom Class वास्तव में DataSet Class को Extend करता है और हमें बहुत सारे ऐसे Objects Provide करता है, जिनका प्रयोग करके हम Underlying Database के साथ आसानी से Interact करने की सुविधा प्राप्त करते हैं।
उदाहरण के लिए Strongly Typed DataSet Object में ऐसी Properties होती हैं, जो Underlying Database की विभिन्न Tables को Directly Map करते हैं। अत: जब Northwind Database के लिए Strongly Typed DataSet Object Create होता है, तो इस Object के माध्यम से यदि हम चाहें तो Northwind Database की विभिन्न Tables जैसे कि Customers, Products, Orders आदि को Directly उनके नाम से Represent कर सकते हैं तथा उनके Rows व Columns को Directly Access कर सकते हैं।
जबकि Strongly Typed DataSet Object की अनुपस्थिति में हमें DataSet Object की Tables Property को Use करते हुए Underlying Database Table के Data को Rows व Columns के Collection के माध्यम से Access करना पडता है, जो कि काफी Typical व Error Prone तरीका होता है।
यदि हम Visual Studio के Solution Explorer Sidebar में दिखाई देने वाले अपने Project पर Right Click करके Display होने वाले “View Class Diagram” Option को Click करें, तो हमारे Project की सभी Classes एक Diagram के रूप में निम्न चित्रानुसार दिखाई देने लगती हैं:
जैसाकि हम इस Class Diagram में देख सकते हैं कि Data Source Wizard ने स्वयं ही NorthwindDataSet नाम का एक नया Class Create कर दिया है, जिसमें बहुत सारे जरूरी Members Automatically Defined हैं। लेकिन इस Class का सबसे महत्वपूर्ण Member Products नाम का Property Member है।
यदि हम Visual Studio के Solution Explorer में दिखाई देने वाले NorthwindDataSet.xsd नाम की File को Double Click करें, तो Visual Studio इस File के Content के आधार पर निम्न चित्रानुसार Automatically Visual Studio DataSet Designer Open कर देता है:
यदि हम इस Designer में कहीं पर भी Right Click करें और Display होने वाले Popup Menu से View Code Option को Click करें, तो हमें निम्नानुसार एक बिल्कुल Empty Partial Class Definition दिखाई देता है:
namespace STDataSet { public partial class NorthwindDataSet { } }
यदि जरूरत हो तो हम हमारी जरूरत के अनुसार इस Empty Partial Class Definition में नए Custom Members भी Add कर सकते हैं। जबकि वास्तविक Operations तो NorthwindDataSet.Designer.cs नाम की File में Perform होते हैं। यदि हम इस File को Open करें,
public partial class NorthwindDataSet : global::System.Data.DataSet { // A member variable of type ProductsDataTable. private ProductsDataTable tableProducts; … // Each constructor calls a helper method named InitClass(). public NorthwindDataSet() { … this.InitClass(); … } // InitClass() preps the DataSet and adds the ProductDataTable to the Tables collection. private void InitClass() { this.DataSetName = "NorthwindDataSet"; this.Prefix = ""; this.Namespace = "http://tempuri.org/NorthwindDataSet.xsd"; this.EnforceConstraints = true; this.SchemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema; this.tableProducts = new ProductsDataTable(); base.Tables.Add(this.tableProducts); } // The read-only Product property returns the ProductDataTable member variable. public ProductsDataTable Products { get { return this.tableProducts; } }
यहां यदि हम ध्यान से देखें तो हमारे Typed DataSet Object (NorthwindDataSet) में एक Strongly Typed DataTable (ProductsDataTable) नाम का Member Variable हैं। यानी वास्तव में जब हम Visual Studio के Data Source Wizard को Use नहीं करते हैं अथवा .XSD File को Manually Design नहीं करते हैं, तब DataSet Object Create करने के लिए हम Manual Coding करते हैं।
लेकिन जब हम Strongly Typed DataSet Object Design करने के लिए Visual Studio द्वारा Provided Wizard या Visual DataSet Designer Tool का प्रयोग करते हैं, तब हमें कोई विशेष Manual Coding नहीं करना होता, बल्कि DataSet को Design करने के साथ ही Visual Studio स्वयं ही जरूरी Coding करता रहता है और वह Coding *.Designer.cs नाम की File के रूप में Visual Studio के Solution Explorer में Available रहता है।
Understanding the Strongly Typed DataTable
यदि हम फिर से अपने Class Diagram File में दिखाई देने वाले NorthwindDataSet में स्थित Nested Types को निम्न चित्रानुसार Open करें, तो हमें ProductsDataTable, ProductsRow, ProductsRowChangeEvent व ProductsRowChangeEventHandler नाम की चार और Strongly Typed Nested Classes दिखाई देती हैं:
यदि हम ProductsDataTable नाम के Strongly Typed DataTable को देखें जैसाकि उपरोक्त चित्र में दर्शाया गया है, तो इसमें भी हमें कई महत्वपूर्ण Members प्राप्त होते हैं। ये Members ठीक Strongly Typed DataSet Object के Members की तरह ही हमारे Underlying Database की Products Table के Column Names को Represent करते हैं।
साथ ही ये ProductsDataTable हमें Custom Indexer व Count नाम की Special Property भी Provide करता है, जिनका प्रयोग करके हम DataTable के सभी Rows को Indexer के माध्यम से Access व Manipulate कर सकते हैं तथा Count Property का प्रयोग करके DataTable में Currently Available कुल Rows की संख्या ज्ञात कर सकते हैं।
इन Properties के अलावा हम देख सकते हैं कि Strongly Typed ProductsDataTable में कुछ Method Members भी हमें प्राप्त होते हैं। इन Strongly Typed Members का प्रयोग करके हम DataTable में नया Record Insert कर सकते हैं, किसी पहले से Exist Row को Delete कर सकते हैं अथवा किसी Row को Locate कर सकते हैं, जो कि DataTable के Data को Navigate करने के लिए Rows व Columns Indexer को Use करने की तुलना में ज्यादा आसान Alternative तरीके की तरह प्राप्त हो रहे हैं।
उदाहरण के लिए AddProductsRow() Method का प्रयोग करके हम हमारे Strongly Typed ProductsDataTable में आसानी से नया Record Add कर सकते हैं, FindByProductID() Method का प्रयोग करके Primary Key के आधार पर किसी Record को Locate कर सकते हैं अथवा RemoveProductsRow() Method का प्रयोग करके किसी Row को Delete कर सकते हैं।
Understanding the Strongly Typed DataRow
जैसाकि हम पिछले चित्र द्वारा समझ सकते हैं कि ProductsRow Class भी ProductsDataTable Class की तरह ही NorthwindDataSet Object की Nested Class है। ये Class DataRow Class से Derived Class है इसलिए इस Strongly Typed Class में Define होने वाली Properties Directly Products Table के Schema से Map होते हैं।
साथ ही Data Designer Tool हमें इस Class को Automatically Design करते समय IsCustomerIDNull() जैसे Validating Methods भी Provide करता है, जिनका प्रयोग करके हम इस बात का पता लगा सकते हैं कि Underlying Database की किसी Specific Table के किसी Column में null Value Stored है या नहीं।
Understanding the Strongly Typed DataAdapter
हालांकि हमने इस पुस्तक के पिछले Chapters में विभिन्न प्रकार के Disconnected Objects को Manually Create करने व उपयोग में लेने के बारे में Detail से जाना है। इसलिए हम आसानी से समझ सकते हैं कि सभी जरूरी Disconnected Objects को Manually Code करते समय हमें कितनी सावधानियां बरतनी पडती हैं और कितने Rules व Regulations को ध्यान में रखना होता है।
इसलिए हम आसानी से समझ सकते हैं कि DataSource Wizard को Use करने के कारण Automatically Generate होने वाले ये Strongly Typed Objects हमारे Coding के काम को कितना कम व आसान कर देते हैं।
चूंकि Automatically Create होने वाले DataSet Object के विभिन्न DataTables में Data को Fill करने अथवा DataTables में किए गए Changes को Underlying Database में Update करने का काम DataAdapter Object द्वारा ही Perform किया जाता है, क्योंकि DataSet Object वास्तव में पूरी तरह से Disconnected Mode के Objects पर आधारित होता है।
इसलिए जब हम DataSource Wizard का प्रयोग करते हैं, तब न केवल Strongly Typed DataSet Objects Create होते हैं, बल्कि Strongly Typed DataAdapter Object भी Create होता है, इसीलिए हमारे Current उदाहरण के लिए भी निम्न चित्रानुसार एक DataAdapter Object Create हो रहा है।
Auto-Generated ProductsTableAdapter Type में SqlCommand Objects का एक Collection भी होता है, जिसे हम CommandCollection Property द्वारा Access करके Use कर सकते हैं। इस Collection के हर SqlCommand में SqlParameter Objects का एक पूरी तरह से Populated Set होता है।
साथ ही ये Custom Data Adapter हमें कुछ Properties भी Provide करता है, जिनका प्रयोग करके हम Underlying Connection, Transaction व Data Adapter Objects से सम्बंधित Information को Extract कर सकते हैं। साथ ही हमें एक ऐसी Property भी प्राप्त होती है, जिसका प्रयोग करके हम Data Adapter के हर Command Type का एक Array Representaion भी Retrieve कर सकते हैं।
यानी DataSource Wizard का प्रयोग करने के कारण Create होने वाला Strongly Typed DataAdapter Object न केवल हमें वे Properties व Methods Provide करता है, जो हमें तब प्राप्त होते हैं, जब हम Manual Coding के माध्यम से Data Adapter Object Create करते हैं, बल्कि हमें कुछ Extra Members भी प्राप्त होते हैं, जिनका प्रयोग करके हम अलग तरह की Requirements को भी ज्यादा आसानी से पूरा कर सकते हैं, जबकि इन्हीं Requirements को पूरा करने के लिए यदि हम Manual Coding का प्रयोग करें, तो हमें काफी Extra Codes लिखने की जरूरत पड सकती है।
इस तरह से Visual Studio द्वारा Automatically Create किए जाने वाले विभिन्न Strongly Typed के बारे में जानने के बाद अब हम इस स्थिति में हैं कि इन Automatically Create होने वाले Strongly Typed Objects को Use करते हुए अपना Windows Forms Application Complete कर सकते हैं, जिसे हमने इस Section की शुरूआत में Create किया था।
यदि हम हमारे Current Windows Forms Application के Form के Code Window में जाऐं, तो हम देख सकते हैं कि Form पर स्थित DataGridView Control को Products Table के Data से Fill करने का काम Form के Load() Event में निम्नानुसार Specify किया गया है:
private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'northwindDataSet.Products' table. // You can move, or remove it, as needed. this.productsTableAdapter.Fill(this.northwindDataSet.Products); }
इस Code में हम देख सकते हैं कि हमारे Form पर स्थित DataGridView Control को Products Table के Data से Fill करने के लिए DataSet Object के Products Property को productsTableAdapter में Parameter की तरह Pass करते हुए किस प्रकार से Use किया गया है।
ठीक इसी प्रकार से हम इसी Custom Table Adapter का प्रयोग करके Form पर स्थित DataGridView Control के Data को Underlying Database के Table में Update करने के लिए भी Use कर सकते हैं और इस जरूरत को पूरा करने के लिए हम हमारे Form को निम्नानुसार Modify करते हुए उस पर एक Command Button Place कर सकते हैं, जिसे Click करने पर DataGridView Control में किए गए सभी Changes, उससे Associated Underlying Database में Permanently Update हो जाते हैं:
Button को Place करने के बाद इस Button के लिए हम निम्नानुसार Click Handler Create कर सकते हैं, जिस पर Click करते ही DataGridView Control में किया गया सारा Change इस DataGridView Control के साथ Associated Underlying Database की Table में Permanently Update हो जाता है:
private void btnSave_Click(object sender, EventArgs e) { try { // Save changes with the Products table back to the database. this.productsTableAdapter.Update(this.northwindDataSet.Products); } catch (Exception ex) { MessageBox.Show(ex.Message); } // Get fresh copy for grid. this.productsTableAdapter.Fill(this.northwindDataSet.Products); }
इस Code को Specify करने के बाद यदि हम हमारे Form पर दिखाई देने वाले DataGridView Control के किसी Row में Stored Data में कोई Change करते हैं या कोई नया Record Insert करते हैं या फिर किसी Row को Delete करते हैं और अन्त में उस Change को Underlying Database में Permanently Save करने के लिए Form पर दिखाई देने वाले Save Button पर Click करते हैं, तो DataGridView Control में किया गया सारा Modification productsTableAdapter Object के निम्न Code के Execute होने के कारण Database की Products Table में Save हो जाता है:
this.productsTableAdapter.Update(this.northwindDataSet.Products);
यानी यदि हम हमारे पूरे Form की Coding देखें, तो ये Coding कुछ निम्नानुसार है:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace STDataSet { public partial class frmNWSTDataSet : Form { public frmNWSTDataSet() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'northwindDataSet.Products' table. // You can move, or remove it, as needed. this.productsTableAdapter.Fill(this.northwindDataSet.Products); } private void btnSave_Click(object sender, EventArgs e) { try { // Save changes with the Products table back to the database. this.productsTableAdapter.Update(this.northwindDataSet.Products); } catch (Exception ex) { MessageBox.Show(ex.Message); } // Get fresh copy for grid. this.productsTableAdapter.Fill(this.northwindDataSet.Products); } } }
जहां हम देख सकते हैं कि वास्तव में हमने इस Program में बहुत ही कम Code लिखा है, फिर भी हमारा Application पूरी तरह से Normal तरीके से काम कर रहा है। यानी हमारे Form पर दिखाई देने वाला DataGridView Control Underlying Database Table के Data से Fill भी हो रहा है और Frontend में DataGridView Control में किए गए जाने वाले Changes को Save Button पर Click करके Underlying Database की Table में Permanently Save भी किया जा रहा है। जबकि इसी समान जरूरत को पूरा करने के लिए हमने इसी पुस्तक के पिछले Changers में Create किए गए Example Programs में बहुत सारे Codes लिखें हैं।
यानी यदि हम Visual Studio द्वारा Provide किए जाने वाले Strongly Typed DataSet Object को बेहतर तरीके से उपयोग में लेना सीख लें, तो हमारे Database Application Development की Speed को कई गुना बढ जाती है क्योंकि हमें हजारों Lines के Common Codes लिखने की जरूरत नहीं रहती।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF