System.Data.DataSet: जैसाकि हमने पिछले Chapters के Discussion से समझा है कि ADO.NET का Disconnected Layer हमें हमारे Data Provider के DataSet, DataTable, DataRow, DataColumn, DataView व DataRelation Object के माध्यम से Underlying Database की एक Logical Copy को Memory के अन्दर Maintain रखने की सुविधा Provide करता है, जिससे हम Multiple Users के बीच Concurrently Access होने वाले हमारे Database को ज्यादा बेहतर तरीके से Control करने की क्षमता प्राप्त करते हैं।
क्योंकि इस Layer द्वारा Provide किए जाने वाले Objects के माध्यम से हम हमारे Application को Use करने वाले हर Client को ऐसा ,हसास करवाने की क्षमता प्राप्त कर लेते हैं जैसे कि वह Underlying Database के साथ Continually Connected है।
जबकि वास्तव में वह बहुत ही कम समय के लिए Underlying Database से Connect होता है और अपना काम पूरा करते ही फिर से Disconnect हो जाता है और ऐसा इसलिए सम्भव हो पाता है क्योंकि ADO.NET का Disconnected Layer हर User को Underlying Database की एक अलग Local Copy पर Operate करने की सुविधा Provide करता है।
यानी Disconnected Model को Use करने पर हमारे Application को Use करने वाला User वास्तव में DataSet Object के रूप में उसके Computer पर Exist एक Local Relational Database Copy को Use करता है, न कि Actual Underlying Database को। जबकि DataSet Object में किए गए को Underlying Database में Permanently Save करने के लिए अथवा Underlying Database के Latest Data से DataSet Object को Refresh करने के लिए हमें DataAdapter Object को Use करना होता है, जो कि ADO.NET के Connected Layer व Disconnected Layer के बीच एक Bridge की तरह काम करता है।
ADO.NET द्वारा Provide किए जाने वाले इन विभिन्न Objects के माध्यम से हम DataSet Object के Data को Access व Manipulate कर सकते हैं और Modified Data को फिर से Underlying Database पर Save करने के लिए Send कर सकते हैं। परिणामस्वरूप स्वरूप Final Result के रूप में हमें एक ऐसा .NET Application प्राप्त होता है, जो Highly Scalable, Performing व Multiple Users के बीच बिना किसी परेशानी के आसानी Concurrently Execute होने में सक्षम होता है।
हालांकि हम बिना Underlying Database से Connect हुए भी ADO.NET के विभिन्न Disconnected Types का प्रयोग कर सकते हैं लेकिन फिर भी हमें Command व Connection Objects को तो Use करना ही पडता है। क्योंकि Underlying Database में Data को Permanently Save करने के लिए अथवा Underlying Database के Latest Updated Data से DataSet Object को Fill करने के लिए हमें Underlying Database से Connection स्थापित करना जरूरी होता है।
लेकिन जब हम ADO.NET के Disconnected Layer को Use कर रहे होते हैं, तब हमें Connection व Command Objects को Use नहीं करना होता, बल्कि हम DataAdapter नाम के एक Object को Use करते हैं, जो कि Internally Command व Connection Objects को Use करते हुए हमारी Connected Database Related Requirements को पूरा करता है।
DataAdapter Object एक ऐसा Object होता है, जो कि DbDataAdapter नाम की .NET Framework की एक Abstract Class को Extend या Inherit करता है, ताकि वह Underlying Database से Data को DataSet Object में Fetch कर सके अथवा DataSet Object में Stored Modified Data से Underlying Database को Update कर सके।
इसी प्रकार से Data Adapter के माध्यम से Obtain होने वाले Data को DataReader Object के माध्यम से Process नहीं किया जाता, जो कि Connected Layer से Related Object है, बल्कि DataAdapter Object, DataSet या DataTable Objects के माध्यम से Data को Frontend व Backend के बीच Move करता है। DataSet Object एक प्रकार से विभिन्न DataTable Objects का Container होता है, जो कि DataRow व DataColumn Objects के Connection से Contained होता है। यानी DataRow व DataColumn Objects के Collection का बना होता है।
हम जिस Data Provider को Use करते हैं, उस Data Provider द्वारा Underlying Database s साथ Connection को Maintain करने का काम Automatically Handle किया जाता है। इसलिए एक बार DataAdapter Object Create करने के बाद हमें Underlying Database के साथ किसी भी तरह का Connection Establish करने अथवा Connection को Close करने की चिन्ता करने की जरूरत नहीं होती। क्योंकि Underlying Database पर कब Connection Open करना है और कम Connection को Close करना है, इसे पूरी तरह से DataAdapter Object द्वारा स्वयं ही Automatically Handle किया जाता है।
DataAdapter द्वारा Connection Related जिम्मेदारियों को स्वयं अपने स्तर पर Handle करने के कारण हमारे Application की Scalability काफी Increase हो जाती है। क्योंकि DataAdapter कई ऐसे Steps Follow करता है, जिनके कारण बहुत ही कम समय के लिए Underlying Database पर Collection Open किया जाता है। जिससे इस Disconnected Layer का प्रयोग करते हुए Develop किए गए Application को बहुत सारे Users एक साथ समानान्तर रूप से Use करते हैं, फिर भी Underlying Database की Performance अच्छी बनी रहती है।
जब DataAdapter को Call करने वाला Caller DataSet Object Receive कर लेता है, उसके बाद Calling Tier यानी Frontend Application जिस तरह से चाहे, उस तरह से इस DataSet Object को Access व Manipulate कर सकता है। यानी उस DataSet Object में Contained विभिन्न DataTable Objects में नया Record Insert कर सकता है, किसी Record को Delete कर सकता है या किसी Record के Data को Change या Modify कर सकता है।
लेकिन DataSet Object के इस Modification से Physical Database तब तक Update नहीं होता, जब तक कि Frontend द्वारा DataTable या DataSet Object को DataAdapter Object में Explicitly Pass नहीं करता। इस Architecture की वजह से Application User को हमेंशा ऐसा ही महसूस होता है, जैसे कि उसका Application Underlying Database के साथ हमेंशा Connected रहता है, जबकि User वास्तव में हमेंशा उसके Local Computer में Stored Data के In-Memory Representation को ही Access व Manipulate कर रहा होता है। इस प्रक्रिया को हम एक चित्र के रूप में निम्नानुसार Represent कर सकते हैं:
Working with DataSet Object
DataSet Object वास्तव में हमारे द्वारा Specify की जाने वाली SQL Query या Stored Procedure के Execution से Generate होने वाले Resultset को एक DataTable या DataSet Object के रूप में Memory में Maintain करता है। ज्यादा सरल शब्दों में कहें तो DataSet एक Class है, जो निम्न चित्रानुसार मूल रूप से तीन Strongly Typed Collections को Maintain करता है:
DataSet Object की Tables नाम की Property का प्रयोग करके हम DataTableCollection को Access करने की सुविधा प्राप्त करते हैं, जिसमें Individual DataTables Contained होते हैं। इसके अलावा DataSet Object द्वारा Use किया जाने वाला दूसरा महत्वपूर्ण Collection DataRelationCollection होता है।
जैसाकि हमने पहले भी बताया कि DataSet Object वास्तव में हमारे Database Schema का एक Disconnected Version होता है, इसलिए हम इस DataRelationCollection का प्रयोग DataSet Object की विभिन्न DataTables के बीच Parent/Child Relationship को Represent करने के लिए Use कर सकते हैं।
उदाहरण के लिए हम दो Tables के बीच ऐसी Relationship Create कर सकते हैं, जो कि DataRelation Type का प्रयोग करते हुए Foreign Key Constraint को Represent करता है। इस Object को हम DataRelationCollection की Relations Property में Add कर सकते हैं। इस प्रकार का Relationship Set करने के बाद हम इन दोनों DataTables के Data को Combined रूप से Access कर सकते हैं, ठीक उसी तरह से जिस तरह से किसी RDBMS में Stored दो Related Tables को SQL JOIN Query के माध्यम से Access करते हैं।
इसी तरह से DataSet Object की ExtendedProperties नाम की Property हमें PropertyCollection Object को Access करने की सुविधा Provide करता है जो कि DataSet Object के Associated अन्य Extra Information को Name/Value Pair के रूप में Access करने की सुविधा Allow करता है। ये Information Literally कुछ भी हो सकता है, जो कि Database से सम्बंधित भी हो सकता है और असम्बंधित भी।
उदाहरण के लिए हम DataSet Object के साथ अपनी Company के नाम को Associate कर सकते हैं, जो कि In-Memory Metadata में Use हो सकता है। इसी तरह से Extended Property के रूप में Time Stamps या Encrypted Password भी हो सकता है, जिसे DataSet के Content को Access करने के लिए Supply किया गया हो सकता है।
DataSet Properties
DataSet Object की तरह ही DataTable व DataColumn Classes भी ExtendedProperties Property को Support करते हैं, क्योंकि हम इन Classes को DataSet Object की तरह ही स्वतंत्र रूप से उपयोग में ले सकते हैं। Tables, Relations व ExtendedProperties Properties के अलावा DataSet Object की कुछ Additional Properties भी होती हैं, जो कि निम्नानुसार हैं:
CaseSensitive Property
इस Property द्वारा ये बात Indicate होती है कि DataTable Object में जो Data Stored है, उस पर यदि String Comparision किया जाए, तो होने वाला Comparision Case Sensitive तरीके से Perform होगा या Case Insensitive तरीके से। जबकि Default रूप से String Comparision Case Sensitive तरीके से Perform नहीं होता।
DataSetName Property
इस Property में DataSet Object का नाम Represent होता है। सामान्यत: इस Value को हम Constructor Parameter की तरह Establish करते हैं।
EnforceConstraints Property
इस Property में हम true/false मान Get/Set कर सकते हैं, जो कि इस बात का Indication होता है कि Update Operation Perform करते समय Constraint Rules को Follow किया जाएगा या नहीं।
HasErrors Property
इस Property का प्रयोग करके DataSet Object के DataTable Object के किसी Row में कोई Error है या नहीं, इस बात का पता लगाया जा सकता है।
RemotingFormat Property
इस Property का प्रयोग करके हम इस बात को तय करते हैं कि DataSet Object अपने Contained Data को XML या Binary में से किस Format में Serialize करेगा, जबकि इसका Default मान XML Format ही होता है।
DataSet Methods
DataSet Object द्वारा Provided Methods का प्रयोग ऊपर Discuss की गई Properties की Functionality को उपयोग में लेते हुए करते हैं, क्योंकि इन Methods को कोई Specific Type की Requirement पूरी करने के लिए उपरोक्तानुसार Discussed Properties को उपयोग में लेना जरूरी होता है। साथ ही XML Streams के साथ Interact करते समय, DataSet Object ऐसे Methods Provide करता है, जो हमें DataSet Object के Contents को Copy करने, Internal Tables को Navigate करने व Batch Updates की Beginning व Ending करने की सुविधा Provide करते हैं। DataSet Object द्वारा Provided विभिन्न Methods निम्नानुसार हैं:
AcceptChanges() Method
इस Method का प्रयोग करने पर Dataset Object में Current Program में ही Just पिछली बार AcceptChanges() Method या Update() Method को Call करने के बाद जितने भी Changes किए गए होते हैं, वे सभी Changes Underlying Database पर Commit हो जाते हैं।
Clear() Method
इस Method का प्रयोग करने पर Dataset Object पूरी तरह से Clear हो जाता है। यानी उसमें जितने भी DataTable Object Contained होते हैं, उन सभी DataTable Objects के सभी DataRow पूरी तरह से Remove हो जाते हैं।
Clone() Method
इस Method का प्रयोग करने पर Specified Dataset Object के Structure का एक Clone यानी Copy Create हो जाता है, लेकिन Data Copy हीं होता। यानी DataSet Object के सभी DataTables व Relations के Structure का एक Clone Create हो जाता है, जिसमें नया Data Fill किया जा सकता है।
Copy() Method
इस Method का प्रयोग करने पर Specified Dataset Object के Structure सहित सभी Data का एक Copy Create हो जाता है।
GetChanges() Method
ये Method, अन्तिम बार AcceptChanges() Method द्वारा Save किए गए Changes के बाद अथवा DataSet Object को Data से Fill करने के बाद Dataset Object में किए गए सभी Changes की एक Copy Return करता है। ये एक Overloaded Method होता है, जिसके विभिन्न Versions का प्रयोग करके हम केवल New Rows, केवल Modified Rows या केवल Deleted Rows को Return करवा सकते हैं।
HasChanges() Method
ये Method, एक Value Return करता है, जो इस बात को Indicate करता है कि DataSet Object में नया Row Insert करके, किसी Row को Modify करके अथवा किसी Row को Delete करके Change किया गया है या नहीं।
Merge() Method
ये Method, Specified DataSet में किसी अन्य DataSet को Merge करता है।
ReadXml() Method
ये Method, DataSet के Structure को Define करने की सुविधा Provide करता है और Read किए गए Data तथा XML Schema के आधार पर DataSet Object को Populate यानी Data से Fill करता है।
RejectChanges() Method
ये Method, अन्तिम बार Call किए गए AcceptChanges() Method के Execution के बाद DataSet Object में किए गए सभी Changes को Rollback करने का काम करता है।
WriteXml() Method
ये Method, DataSet Object के Content को एक Valid Stream में Write करने का काम करता है।
DataSet Object के विभिन्न Properties व Methods को समझने के बाद अब हम इन्हें एक Example Program में Practically Use करेंगे, ताकि हम इनकी Working को Practical तरीके से समझ सकें। हमारा Example Program कुछ निम्नानुसार हो सकता है:
using System; using System.Data; using System.Data.SqlClient; namespace UsingDataSet { class Program { 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"; } } }
इस Code में हमने सबसे पहले dsNorthwind नाम का एक नया DataSet Object Create किया है, जिसके साथ Time Stamp, Unique Identifier व Company Name नाम के तीन ExtendedProperties को Set किया है। DataSet Object को एक Unique Identifier Set करने के लिए हमने Guid.NewGuid() Method को Use किया है, जो कि एक 128-Bit Unique Number को हमारे DataSet Object के साथ Attach करता है।
चूंकि DataSet Object तब तक उपयोगी नहीं होता, जब तक कि हम इसमें कम से कम एक DataTable Object Create न करें। जबकि DataTable Object वास्तव में DataColumn Collection द्वारा Define होता है। इसलिए अब हमें DataColumn को ठीक से समझना होगा, तभी हम DataTable Create कर सकते हैं और Disconnected Layer के DataSet Object को बेहतर तरीके से Utilize कर सकते हैं।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF