Strongly Typed Language – ADO.NET DataSet: DataSets सामान्यत: Strongly Typed नहीं होते। यानी यदि हम एक ऐसा DataSet Create करते हैं, जो कि Customers की Information को Hold करता है, तो DataSet के माध्यम से उस Customer Object को Access करने के लिए हमें निम्नानुसार Statement लिखना होता है:
Int32 CustomerID = (Inte32)dsCustomer.Tables[“Customers”].Rows[0][“CustomerID”];
इस तरीके से DataSet Object के माध्यम से Customer की Information को Access करने में कुछ परेशानियां हैं जो निम्नानुसार हैं:
- हमें हमेंशा अपने DataSet Object में Contained Table व उनके Columns का नाम ध्यान रखना जरूरी होता है। इतना ही नहीं हमें उन Columns के नामों को Exactly उसी तरह से लिखना भी जरूरी होता है, जिस तरह से उन्हें DataSet Object में Contained DataTables में लिखा गया है। जबकि यदि हम एक Singe Character का भी Mistake कर दें, जो कि काफी हद तक सम्भव है, तो इस प्रकार से की गई Mistake का पता Compile Time में नहीं बल्कि Runtime में चलता है।
- चूंकि DataSet Object हमेंशा Return Value के रूप में एक Object Return करता है, इसलिए विभिन्न प्रकार के Conversions के रूप में Boxing/Unboxing Perform होता है, जिससे Application की Performance प्रभावित होती है।
- यदि हम कुछ ऐसा Data प्राप्त करते हैं, जो कि प्राप्त नहीं होना चाहिए, तो इस प्रकार के Data को Check करने के लिए DataSet हमें किसी प्रकार का कोई तरीका Provide नहीं करता।
इस प्रकार की समस्याओं को Strongly Typed DataSets द्वारा Solve किया जा सकता है। हालांकि वास्तव में Boxing/Unboxing या Conversion Related समस्याओं को Strongly Typed DataSets द्वारा Solve नहीं किया जाता, बल्कि Masked कर दिया जाता है, क्योंकि Strongly Typed DataSets के लिए Automatically Generate होने वाले Codes हमारे लिए इन Conversion से सम्बंधित Issues का ध्यान रखते हैं।
Strongly Typed DataSet Object का मुख्य फायदा ये है कि इस प्रकार के Objects को Use करने पर हम निम्नानुसार लि[ो जाने वाले Code Statement को:
customerRow = dsCustomer.Tables[“Customers”].Rows[0];
Console.WriteLine(customerRow[“FirstName”]);
निम्नानुसार ज्यादा सरल व बेहतर तरीके से लिख सकते हैं:
Console.WriteLine(CustomerDataSet.Customers(0).FirstName);
हम समझ सकते हैं कि पहले तरीके से DataSet के Data को Access करने की तुलना में इस दूसरे तरीके से Data को Access करना ज्यादा आसान है। इस दूसरे तरीके का Statement लिखने की सुविधा हमें .NET Framework द्वारा Provided Strongly Typed DataSets Concept के कारण प्राप्त होती है, जिसके अन्तर्गत हमें प्राप्त होने वाली DataSet Classes ऐसी Classes से Inherit होता हैं, जो इन DataSet Classes को Strongly Typed Nature Provide करती हैं, जबकि इन Strongly Typed Nature को Define करने का काम हम एक XSD Structure के माध्यम से किया जाता है।
एक Typed DataSet Object, .NET Framework का Built-In Member नहीं होता, बल्कि ये एक Generated Class होता है, जो DataSet Class से Directly Inherit होता है और हमारे द्वारा Defined एक XML Schema के आधार पर Properties व Methods को Customize करने की सुविधा Allow करता है। इस Class में DataTable व DataRow Objects के लिए अन्य Classes भी होती हैं, जिन्हें इसी तरीके से Enhance किया जाता है।
परिणामस्वरूप हम हमारे Data के लिए ऐसे Schemas व Classes Create कर सकते हैं, जिन्हें बिल्कुल उसी तरह से Customize किया जाता है, जिस तरह का हमारा Database होता है। जिसकी वजह से हम हमारे Data-Access Codes को ज्यादा Efficient तरीके से लिखने में सक्षम हो जाते हैं।
इसलिए Strongly Typed DataSets Define करने के लिए हमें XSD Schemas लिखने की जरूरत पडती है। वास्तव में सच्चाई ये है कि सभी प्रकार के XSD Schema, Accurate DataSet बनने के लिए Qualified नहीं होते। इसलिए हमारे लिए ये जानना उपयोगी होता है कि DataSet का कौनसा Aspect, XML Schema में Allowed है और क्या नहीं।
अच्छी बात ये है कि हमारी ज्यादातर Requirements को पूरा करने के लिए हमें XSD Schema को Manually Create करने की जरूरत नहीं होती, बल्कि Visual Studio हमारे लिए स्वयं ही Appropriate XSD Schema Create करता रहता है।
इसलिए जब हम कोई नया DataTable Object Create करते हैं, Visual Studio स्वयं ही हमारे लिए XSD Schema Create कर देता है, जिसके अन्तर्गत हमारे DataSet Object के विभिन्न Parts जैसे कि Data Types, Relationships, Keys, Constraints आदि की Information एक XML Formatted File के रूप में Create होता है, जबकि हमें हमारे DataSet Object के विभिन्न DataTable Objects एक Visual Table के रूप में दिखाई देते हैं, जिन्हें हम Visually Design व Manage कर सकते हैं।
Building Strongly Typed DataSets
Strongly Typed DataSets को उपयोग में लेकर हम किसी भी प्रकार के Data Source के साथ समान प्रकार से प्रक्रिया कर सकते हैं। फिर इस बात से कोई फर्क नहीं पडता कि Data किसी RDBMS यानी Relational Database से आ रहा है या किसी XML Document से। यानी हम किसी भी प्रकार के DataSource से आने वाले Data से DataSet Object या DataTable Object को Fill कर सकते हैं।
सरल शब्दों में कहें तो Strongly Typed DataSets हमें निम्न प्रकार के Codes के स्थान पर:
customerRow = dsCustomer.Tables[“Customers”].Rows[0];
Console.WriteLine(customerRow[“FirstName”]);
निम्न प्रकार के Codes लिखने की सुविधा Provide करते हैं:
Console.WriteLine(CustomerDataSet.Customers(0).FirstName);
और ये सुविधा हमें केवल .NET Framework के Inheritance व Clear Logical Object Hierarchies के कारण प्राप्त होता है।
Strongly Typed DataSet का मुख्य Concept यही है कि एक नया Class Create होता है, जो कि DataSet Class से Derive होता है। ये Newly Created Class Properties व Methods को Implement करता है, जो कि XSD Schema के आधार पर Strongly Typed होते हैं, जिसका प्रयोग इस प्रकार की नई Class को Generate करने के लिए Indirectly किया जाता है।
जब इस Newly Created Derived Class को Instantiate किया जाता है यानी इसका Object Create किया जाता है, तो ये Object Integer Type की Logically Named Property Provide करता है (यदि हमारा Schema Integer Columns के लिए Call किया गया हो तो) जबकि Strongly Typed Rows के Array की तरह Logically Named Properties Provide करता है।
इसलिए DataRows व DataTables के साथ Deal करने के स्थान पर हम Task Specialized Concepts जैसे कि CustomersRow या CustomersTable के साथ Deal कर सकते हैं, जिनमें FirstName या LastName, Columns के रूप में हो सकते हैं। परिणामस्वरूप हमें Array Indices/Indexers Accessors को Use करते हुए DataRows व DataTables को Access करने की जरूरत नहीं रहती।
Strongly Typed DataSets Create करने के लिए हम दो तरीके अपना सकते हैं, जिसमें से पहले तरीके के अन्तर्गत हम Visual Studio को Use करते हैं, जबकि दूसरे तरीके के अन्तर्गत हम Manually XML Code लिखते हैं।
चूंकि Visual Studio का प्रयोग करना आसान होता है, इसलिए हम Visual Studio का प्रयोग करते हुए ही Strongly Typed DataSet Create करने के बारे में जानेंगे, क्योंकि Manual तरीका काफी जटिल है और Manual तरीके को Use करने से पहले हमें XSD Schema के बारे में Detail से समझना जरूरी है।
जबकि किसी भी Professional Development के दौरान कम से कम समय में Development करना सबसे जरूरी होता है क्योंकि अधिक समय का प्रयोग Application Software के Budget को बढा देता है, जो कि किसी भी तरह से सहनी; नहीं है।
साथ ही यदि हम .NET Framework Based Professional Application Develop करते हैं, तो निि”चत रूप से Visual Studio से बेहतर कोई भी अन्य IDE उपलब्ध नहीं है और हम हमेंशा Visual Studio का प्रयोग करते हुए ही Professional .NET Application Develop करते हैं।
Visual Studio का प्रयोग करते हुए Strongly Typed DataSet Create करने के लिए हमें निम्नानुसार Steps को Follow करना होता है और ये Steps सभी प्रकार के Projects जैसे कि Windows Forms, Console Application, Web Forms आदि सभी के लिए लगभग समान ही होते हैं:
- सबसे पहले एक नया Console Application Create करते हैं।
- नया Console Application Project Create होने के बाद PROJECT => Add New Item… Option को Click करते हैं अथवा Ctrl+Shift+A Shortcut Key Combination को Use करते हैं। इस Option पर Click करते ही हमारे सामने निम्नानुसार “Add New Item” नाम का एक नया Dialog Box Appear होता है:
- इस Dialog Box में दिखाई देने वाले DataSet Object को Select करके Name Textbox में Appropriate नाम Specify करने के बाद हमें Add Button पर Click करना होता है। जैसे ही हम Add Button पर Click करते हैं, हमारे Visual Studio में निम्नानुसार एक नया Form Word-Area Display हो जाता है:
- इस नए Work-Area के साथ Left Side में दिखाई देने वाले Toolbox में DataTables नाम के Tool को जब हम Work-Area में Drag करके लाते हैं, तो इस Word-Area में निम्न चित्रानुसार एक नया DataTable Object Create हो जाता है:
- और जैसाकि उपरोक्त चित्र में हम देख सकते हैं, इस Newly Created DataTable Object में नया Column Add करने के लिए हम इसके Titlebar पर Right Click करते हैं और Display होने वाले Popup Menu से Add Option को Select करने पर एक नया Sub-Menu Display होता है, जिसमें दिखाई देने वाले Column Option को Click करने पर अथवा Ctrl+L Control Key Press करने पर एक नया Column Add हो जाता है।
- पिछले दोनों Steps को Use करते हुए हम निम्न चित्रानुसार authors व author_detail नाम की दो DataTables Create करते हैं:
- दोनों Tables के विभिन्न Columns की विभिन्न प्रकार की Properties को Set करने के लिए हम Visual Studio के Properties Window का प्रयोग कर सकते हैं। साथ ही उपरोक्त चित्र में दर्शाए अनुसार जब हम दोनों Tables के बीच Relationship Establish करना चाहते हैं, तो इस Relationship को Establish करने के लिए भी हमें Detail DataTable के Foreign-Key Column को Drag करके Master DataTable के Primary-Key Column पर Drop करना होता है अथवा यदि हम चाहें तो Toolbox में दिखाई देने वाले Relation Tool को Drag करके Designer Word-Area में Drop करते हैं और जैसे ही हम ऐसा करते हैं, हमारे सामने निम्नानुसार नया Relation Dialog Box Display होता है:
- इस Dialog Box में Name Textbox में एक Specific नाम Specify करते हैं, जो कि हमारी Relationship को Represent के नाम को करता है। साथ ही हमें Parent Table व Child Table को दिखाई देने वाले Combobox से Select करना होता है और दोनों ही DataTable के ID Columns को उपरोक्त चित्रानुसार Select करना होता है। जैसे ही हम ये सभी Settings करके OK Button पर Click करते हैं, हमारी दोनों Tables के बीच निम्न चित्रानुसार एक Relationship Display होती है:
- अन्त में हमें इस Design Work-Area में Click करने पर Property Window में दिखाई देने वाली Namespace Property में Appropriate Domain Name Specify करना होता है, ताकि हमारे Application के लिए ये DataSet Object एक Unique DataSet Object की तरह Represent हो।
इस तरह से Visual Studio का प्रयोग करके हम Graphical तरीके से Strongly Typed DataSet Object Create कर सकते। जब हम उपरोक्तानुसार Visual तरीके से Strongly Typed DataSet Design करते हैं, तब भी Visual Studio इस पूरे Visual Design को एक Invisible XML Format में Define करता है, जो कि Visual Studio में हमें Visual तरीके से Display होता है।
इस XML Format File को XML Format में ही देखने के लिए हमें Solution Explorer Window में दिखाई देने वाली अपनी dsAuthors.xsd File पर Mouse से Right Click करना होता है, जिससे निम्न चित्रानुसार एक Popup Window दिखाई देता है:
जहां दिखाई देने वाले “Open With…” Option को Click करने पर हमारे सामने निम्नानुसार एक नया Dialog Box Display होता है:
इस Dialog Box में उपरोक्त चित्रानुसार “XML (Text) Editor” Option को Select करके OK Button पर Click करते ही हमारे सामने हमारे DataSet Object के वे XML Codes Display होते हैं, जिसके आधार पर Visual Studio में दिखाई देने वाला Visual DataSet Object Designer काम करता है और हम हमारा DataSet Object Visually Create कर पाते हैं। यदि हमने उपरोक्त तरीके से जो Strongly Typed DataSet Object Create किया है, उस .XSD File का XML Code देखना चाहें, तो ये XML Code कुछ निम्नानुसार होता है:
<?xml version="1.0" encoding="utf-8"?> <xs:schema id="dsAuthors" targetNamespace="https://www.bccfalna.com/dsAuthors.xsd" xmlns:mstns="https://www.bccfalna.com/dsAuthors.xsd" xmlns="https://www.bccfalna.com/dsAuthors.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop" attributeFormDefault="qualified" elementFormDefault="qualified"> <xs:annotation> <xs:appinfo source="urn:schemas-microsoft-com:xml-msdatasource"> <DataSource DefaultConnectionIndex="0" FunctionsComponentName="QueriesTableAdapter" Modifier="AutoLayout, AnsiClass, Class, Public" SchemaSerializationMode="IncludeSchema" xmlns="urn:schemas-microsoft-com:xml-msdatasource"> <Connections /> <Tables /> <Sources /> </DataSource> </xs:appinfo> </xs:annotation> <xs:element name="dsAuthors" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:EnableTableAdapterManager="true" msprop:Generator_DataSetName="dsAuthors" msprop:Generator_UserDSName="dsAuthors"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="authors" msprop:Generator_TableClassName="authorsDataTable" msprop:Generator_TableVarName="tableauthors" msprop:Generator_TablePropName="authors" msprop:Generator_RowDeletingName="authorsRowDeleting" msprop:Generator_RowChangingName="authorsRowChanging" msprop:Generator_RowEvHandlerName="authorsRowChangeEventHandler" msprop:Generator_RowDeletedName="authorsRowDeleted" msprop:Generator_UserTableName="authors" msprop:Generator_RowChangedName="authorsRowChanged" msprop:Generator_RowEvArgName="authorsRowChangeEvent" msprop:Generator_RowClassName="authorsRow"> <xs:complexType> <xs:sequence> <xs:element name="au_id" msprop:Generator_ColumnVarNameInTable="columnau_id" msprop:Generator_ColumnPropNameInRow="au_id" msprop:Generator_ColumnPropNameInTable="au_idColumn" msprop:Generator_UserColumnName="au_id" type="xs:string" minOccurs="0" /> <xs:element name="lname" msprop:Generator_ColumnVarNameInTable="columnlname" msprop:Generator_ColumnPropNameInRow="lname" msprop:Generator_ColumnPropNameInTable="lnameColumn" msprop:Generator_UserColumnName="lname" type="xs:string" minOccurs="0" /> <xs:element name="fname" msprop:Generator_ColumnVarNameInTable="columnfname" msprop:Generator_ColumnPropNameInRow="fname" msprop:Generator_ColumnPropNameInTable="fnameColumn" msprop:Generator_UserColumnName="fname" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="author_detail" msprop:Generator_TableClassName="author_detailDataTable" msprop:Generator_TableVarName="tableauthor_detail" msprop:Generator_TablePropName="author_detail" msprop:Generator_RowDeletingName="author_detailRowDeleting" msprop:Generator_RowChangingName="author_detailRowChanging" msprop:Generator_RowEvHandlerName="author_detailRowChangeEventHandler" msprop:Generator_RowDeletedName="author_detailRowDeleted" msprop:Generator_UserTableName="author_detail" msprop:Generator_RowChangedName="author_detailRowChanged" msprop:Generator_RowEvArgName="author_detailRowChangeEvent" msprop:Generator_RowClassName="author_detailRow"> <xs:complexType> <xs:sequence> <xs:element name="au_id" msprop:Generator_ColumnVarNameInTable="columnau_id" msprop:Generator_ColumnPropNameInRow="au_id" msprop:Generator_ColumnPropNameInTable="au_idColumn" msprop:Generator_UserColumnName="au_id" type="xs:string" minOccurs="0" /> <xs:element name="qualification" msprop:Generator_ColumnVarNameInTable="columnqualification" msprop:Generator_ColumnPropNameInRow="qualification" msprop:Generator_ColumnPropNameInTable="qualificationColumn" msprop:Generator_UserColumnName="qualification" type="xs:string" minOccurs="0" /> <xs:element name="extraqualification" msprop:Generator_ColumnVarNameInTable="columnextraqualification" msprop:Generator_ColumnPropNameInRow="extraqualification" msprop:Generator_ColumnPropNameInTable="extraqualificationColumn" msprop:Generator_UserColumnName="extraqualification" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> <xs:annotation> <xs:appinfo> <msdata:Relationship name="KeyAuthorID" msdata:parent="authors" msdata:child="author_detail" msdata:parentkey="au_id" msdata:childkey="au_id" msprop:Generator_UserChildTable="author_detail" msprop:Generator_ChildPropName="Getauthor_detailRows" msprop:Generator_UserRelationName="KeyAuthorID" msprop:Generator_ParentPropName="authorsRow" msprop:Generator_RelationVarName="relationKeyAuthorID" msprop:Generator_UserParentTable="authors" /> </xs:appinfo> </xs:annotation> </xs:schema>
इस Code को देखकर ही हम समझ सकते हैं कि इस Code को Manually Create करते हुए Strongly Typed DataSet Object Create करना कोई ज्यादा समझदारी का काम नहीं है, बल्कि Visual Studio के Visual Tool को Use करना ही हमारे लिए सबसे उपयुक्त तरीका है।
एक बार Strongly Typed DataSet Object Create कर लेने के बाद हम हमारी DataTable के Data को किसी भी Format में Retrieve करके अपने Program Code में बिना नया DataSet या DataTable Object Create किए हुए Strongly Typed DataSet व DataTable Object के माध्यम से Data को Access व Manipulate कर सकते हैं।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF