C# DataReader Object: जब एक बार हम Underlying Database के साथ Connection Establish कर लेते हैं और SQL Command Execute करने के लिए Command Object Create कर लेते हैं, तो अगले Step के रूप में हमें हमारी SQL Query को Command Object के माध्यम से Underlying Database पर Submit करना होता है।
हालांकि हम कई तरीकों से ऐसा कर सकते हैं, लेकिन हम DbDataReader Type, जो कि IDataReader Interface को Implement करता है, के Object के माध्यम से सबसे सरल तरीके से इस SQL Query को Underlying Database पर Execute कर सकते हैं।
चूंकि DataReader Object Return होने वाले Data को एक Read-Only व Forward-Only Data Stream के रूप में Represent करता है, जो कि एक बार में केवल एक ही Record Return करता है। इसलिए DataReader Object केवल उसी स्थिति में उपयोगी होते हैं, जब हमें Underlying Data Source पर केवल SQL Selection Statements को ही Submit करना होता है।
DataReader तब उपयोगी साबित होते हैं, जब हमें बहुत सारे Data को बहुत ही तेजी से Iterate करना होता है लेकिन इस बहुत सारे Data को Memory में Maintain नहीं करना होता। उदाहरण के लिए यदि हमें 1 लाख Records को किसी Table से किसी Text File में Store करना हो, तो इन Records को हम DataSet Object में Hold नहीं कर सकते, क्योंकि DataSet Object Underlying Table के सारे Data को In-Memory Hold करके Process करता है।
इस स्थिति में यही बेहतर होता है कि हम एक DataReader Object Create करें और बिना सभी Records को Memory में Hold किए हुए सीधे ही सभी Records पर तेजी से Iterate करें। लेकिन यहां इस बात का भी ध्यान रखना जरूरी होता है कि जब हम DataReader Object Use करते हैं, तो Underlying Database के साथ Connection तब तक Open रहता है, जब तक हमारा Processing पूरी तरह से Complete नहीं हो जाता, जिससे Underlying Database की Performance भी प्रभावित होती है।
DataReader Object हमें तब प्राप्त होता है, जब हम हमारे Command Object के साथ ExecuteReader() Method को Call करते हैं। DataReader Object Underlying Database से Read किए गए Current Record को Represent करता है। इस DataReader Object में एक Indexer Method होता है, जो Read होने वाले Current Record के Columns को Access करने की सुविधा Provide करता है। इन Columns को हम उनके Name से भी Access कर सकते हैं और 0 Based Index Number से भी।
इसीलिए इस Chapter के First Program के रूप में हमने DataReader Object के लिए Read() Method को Use करते हुए इस बात को Determine किया है कि हमारा Loop अन्तिम Record पर कब पहुचंता है। जबकि Loop के हर Iteration में Data Reader द्वारा Underlying Database से Read होने वाले हर Record के विभिन्न Columns के Data को इसी Loop के माध्यम से Output में Display किया गया है। इस Program में Specify किया गया Looping Statement कुछ निम्नानुसार है:
// Obtain a data reader a la ExecuteReader(). using (SqlDataReader myDataReader = myCommand.ExecuteReader()) { // Loop over the results. Console.WriteLine("ProductID \t UnitsInStock \t ProductName "); while (myDataReader.Read()) { Console.WriteLine("{0} \t\t {1} \t\t {2}.", myDataReader["ProductID"].ToString(), myDataReader["UnitsInStock"].ToString(), myDataReader["ProductName"].ToString()); } } }
चूंकि .NET Framework में हमारे DataReader Object के Indexer को Overload किया गया है, इसलिए DataReader Object में Underlying Database द्वारा Retrieve होने वाले Records के Columns को हम उनके नाम या Index Number दोनों तरीकों से Access कर सकते हैं। परिणामस्वरूप यदि हम चाहें तो हम हमारे उपरोक्त Code Segment को निम्नानुसार Modify भी कर सकते हैं:
// Obtain a data reader via ExecuteReader(). using (SqlDataReader myDataReader = myCommand.ExecuteReader()) { // Loop over the results. Console.WriteLine("ProductID \t UnitsInStock \t ProductName "); while (myDataReader.Read()) { for (int i = 0; i < myDataReader.FieldCount; i++) { Console.WriteLine("{0} = {1} ", myDataReader.GetName(i), myDataReader.GetValue(i).ToString()); } } }
यदि हम इस Modified Code Segment वाले Program को Run करें, तो हमें हमारा Output कुछ निम्नानुसार प्राप्त होता है:
क्योंकि हमने हमारे Modified Program Code में Column के Name के साथ Column की Value को भी Side-by-Side Display कर दिया है।
Accessing Multiple Resultsets
Execute होने वाले Command Object में Specified SQL Query के आधार पर DataReader Object में Multiple Resultsets भी हो सकते हैं। उदाहरण के लिए यदि हमें Northwind Database की Customers व Products दोनों Tables के सारे Records Retrieve करने हों, तो हम हमारे Command Object में निम्नानुसार SQL Statement को Execute होने के लिए Setup कर सकते हैं:
string strSQL = Select * from Customers;Select * From Employees”;
इस SQL Statement को जिस Command Object में Embed करके Execute किया जाता है, उस Command Object से Return होने वाले DataReader Object में दोनों ही SQL Queries से Generate होने वाले Resultsets होते हैं।
इसलिए अलग-अलग SQL Queries द्वारा Generate होने वाले Resultsets को Access करने के लिए हमें DataReader Object के NextResult() Method को Use करना होता है। इसलिए यदि हम उपरोक्त SQL Query से Generate होने वाले Multiple Resultsets के Records को अलग-अलग Access करना चाहें, तो इस जरूरत को पूरा करने के लिए हम निम्नानुसार Code Use कर सकते हैं:
using System; using System.Data; using System.Data.SqlClient; namespace ConnectedLayer { class Program { static void Main(string[] args) { // Create and open a connection. using (SqlConnection cn = new SqlConnection()) { cn.ConnectionString = @" Data Source=.\SQLSERVEREXPRESS; Initial Catalog=Northwind; Integrated Security=True; Timeout=20"; cn.Open(); SqlCommand myCommand = new SqlCommand ("Select * from Customers;Select * From Employees", cn); // Obtain a data reader via ExecuteReader(). using (SqlDataReader myDataReader = myCommand.ExecuteReader()) { // Loop over the results. do { while (myDataReader.Read()) { for (int i = 0; i < myDataReader.FieldCount; i++) { Console.WriteLine("{0} = {1}", myDataReader.GetName(i), myDataReader.GetValue(i).ToString()); } Console.WriteLine(); } } while (myDataReader.NextResult()); } } } } }
चूंकि इस Program में हम दो Tables Employees व Customers के सभी Records को एक साथ Access कर रहे हैं, इसलिए इस Program में Specified do…while Loop दोनों Tables के सभी Records को Access करने का काम करते हैं, जबकि while Loop Currently Selected Table के Data को Process करता है।
यानी सबसे पहले Customers Table का Data Process होता है उसके बाद Employees Table का, क्योंकि हमारी SQL Query में हमने पहले Customers Table के Records को Select किया है उसके बाद Employees Table के Records को।
जब हम Data Reader Object Use करते हैं, तब हमें हमेंशा इस बात को ध्यान में रखना होता है कि Data Reader Object हमेंशा केवल SQL SELECT Statement के साथ ही Use किया जा सकता है। यानी DataReader Object का प्रयोग हम किसी INSERT, UPDATE या DELETE SQL Statement के साथ नहीं कर सकते।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF