SqlDataAdapter Example in C# – Manual Code: जिस तरह से पिछले Section में हमने Visual Studio के Wizard का प्रयोग करके एक Windows Form Application Create किया था, Exactly वही Windows Form Application हम Manual Coding द्वारा भी Create कर सकते हैं और इस Section में हम इसी विषय में जानकारी प्राप्त करेंगे।
सबसे पहले हम पहले की तरह ही एक Windows Forms Application Create करने के लिए FILE => New => Project से Windows Forms Application Project को चुनेंगे और उपयुक्त नाम व Solution Specify करने के बाद OK Button पर Click करेंगे, जिससे हमारे सामने एक नया Form Display हो जाएगा, जिस पर एक DataGridView Control व दो Button Controls को Place करके निम्नानुसार तरीके से इस Design करेंगे-
Form Design करने के बाद अब Form पर Right Click करने पर दिखाई देने वाले Popup Menu से “Code View” Option को Select करके Code Window में जाते हैं, जहां पहले से ही Visual Studio द्वारा Generated निम्नानुसार Code Exist होता है:
using System; using System.Data; using System.Windows.Forms; using System.Data.SqlClient; namespace ManualCoding { public partial class frmManualCoding : Form { private DataTable tblAuthors; public frmManualCoding() { InitializeComponent(); tblAuthors = new DataTable(); dgvAuthors.DataSource = tblAuthors; } } }
इस Code में हमने दो Line Extra Specify की हैं। पहली Line के रूप में हमने निम्नानुसार System.Data.SqlClient Namespace को अपने Program में Use किया है, क्योंकि हम SQL Server Data Source से Connect करना चाहते हैं:
using System.Data.SqlClient;
इसी तरह से Current Form के लिए Define किए गए सभी Methods, Underlying Data Source से आने वाले Data को Hold करने वाले DataTable Object को Access कर सकें, इसके लिए हमने हमारी frmManualCoding नाम की Class Form Class से Inherited Class में निम्नानुसार एक नया DataTable Object का Reference Create किया है जो कि .NET Framework में Exist Form नाम से Inherited है:
private DataTable tblAuthors;
चूंकि इस Reference को हमने frmManualCoding नाम की Class में Declare किया है, इसलिए इस Class के जितने भी Methods होंगे, वे सभी इस Object को Access कर सकेंगे, जबकि इस Reference को Actual Memory Allocate करने का काम निम्न Statement द्वारा किया गया है:
tblAuthors = new DataTable();
परिणामस्वरूप जब हम हमारे Application को Run करते हैं, उपरोक्त Code Execute होता है और Application के Initialize होते ही उपरोक्त Code Execute होने की वजह से tblAuthors नाम का एक DataTable Object Create हो जाता है।
DataTable Object Create होने के बाद इसमें अन्य किसी Method के Execution द्वारा यदि कोई Data Fill किया जाता है, तो उस Filled Data को Frontend Application में DataGridView Bind Control में Display करने के लिए हमने निम्नानुसार अगला Statement लिखा है:
dgvAuthors.DataSource = tblAuthors;
इस Statement के अन्तर्गत dgvAuthors हमारे Form पर स्थित DataGridView Control का नाम है, जिसकी DataSource Property में हमने tblAuthors Object को Value के रूप में Assign कर दिया है। परिणामस्वरूप यदि DataTable Type के Object tblAuthors में किसी भी तरीके से किसी भी तरह का परिवर्तन होता है, तो वह परिवर्तन तुरन्त हमारे Form के DataGridView Control में Reflect होगा।
इस प्रकार से Form के Codes को उपरोक्तानुसार DataTable Object व DataGridView Control के लिए Modify करने के बाद फिर से Form Designer पर जाकर btnExit Button को Double Click करते हैं। परिणामस्वरूप निम्नानुसार एक नया Event Handler Create होता है:
private void btnExit_Click(object sender, EventArgs e) { this.Dispose(); }
उपरोक्त Event Handler तब Execute होता है, जब हम Form पर दिखाई देने वाले Exit Button को Click करते हैं। ठीक इसी तरह से Form पर दिखाई देने वाले “Fill with Data” Button को Double Click करने पर Create होने वाले Event Handler में हमें निम्नानुसार Code लिखना होता है:
private void btnFill_Click(object sender, EventArgs e) { string conStr = "Data Source=.\\SQLSERVEREXPRESS;Initial Catalog=pubs;Integrated Security=True"; using (SqlConnection conAuthors = new SqlConnection(conStr)) { SqlCommand comAuthors = conAuthors.CreateCommand(); comAuthors.CommandText = "SELECT * FROM authors"; SqlDataAdapter daAuthors = new SqlDataAdapter(comAuthors); daAuthors.Fill(tblAuthors); } }
इस प्रकार से जब हम हमारे Form पर दिखाई देने वाले “Fill with Data” Button पर Click करते हैं, तो Click करते ही उपरोक्त Event Handler Execute होता है। परिणामस्वरूप सबसे पहले निम्न Code Execute होकर Underlying DataSource से Connection स्थापित करता है:
string conStr = “Data Source=.\\SQLSERVEREXPRESS;
Initial Catalog=pubs;
Integrated Security=True”;
using (SqlConnection conAuthors = new SqlConnection(conStr))
यदि Connection Normal तरीके से Establish हो जाता है, तो अगला Code Execute होता है, जो कि एक Command Object Create करता है और उसी CommandText Property में एक SQL Command को Specify करता है, जिसके Execute होने के आधार पर Underlying DataSource से Resultset Generate होता है:
SqlCommand comAuthors = conAuthors.CreateCommand();
comAuthors.CommandText = “SELECT * FROM authors”;
फिर निम्न Code Execute होता है, जो कि एक DataAdapter Object Create करता है और इस DataAdapter Object में Command Object के Execute होने के कारण जो Resultset Generate होता है, उसे Store कर दिया जाता है:
SqlDataAdapter daAuthors = new SqlDataAdapter(comAuthors);
परिणामस्वरूप उपरोक्त Statement Execute होते ही daAuthors Object में Underlying DataSource से सभी Authors की सारी Information Store हो जाती है।
चूंकि DataAdapter Object ADO.NET के Connected व Disconnected Architecture के बीच Bridge की तरह Exist होता है, इसलिए जब निम्न Statement Execute होता है:
daAuthors.Fill(tblAuthors);
तो ADO.NET के Connected Architecture से जो Resultset Generate होकर daAuthors नाम के DataAdapter Object में Fill हुआ था, उस Resultset को Fill Method का प्रयोग करते हुए tblAuthors नाम के उस DataTable Object में Store कर दिया जाता है, जिसे हमने अपने Frontend Form पर स्थित DataGridView Object की DataSource Property के साथ Attach किया है।
परिणामस्वरूप जैसे ही इस tblAuthors नाम के Disconnected Object में DataAdapter Object में Stored Resultset Fill होता है, हमें सभी Authors की Information निम्न चित्रानुसार Display होने लगती है:
SqlDataAdapter() Constructor के मूल रूप से कुल चार Overloaded Versions हैं। हमने अपने पिछले Program में जिस Overloaded Version को Use किया है, वह Version हमें Constructor के अन्दर ही Parameter के रूप में Command Object को Accept करने की सुविधा देता है, जो कि पहले से ही किसी Appropriate Connection के साथ Setup होता है। इस Constructor के अन्य तीनों Versions की Details निम्नानुसार हैं:
SqlDataAdapter()
इस Version को Use करने पर Valid Connection के साथ Associated SelectCommand Property के माध्यम से Setup किया जाता है।
SqlDataAdapter(string, CommandText, SqlConnection connection)
इस Version को Use करने पर ConnectionString तथा Valid CommandText को Connection Object की Information के साथ Specify किया जाता है, जिनके माध्यम से Form पर स्थित Object Fill होता है।
SqlDataAdapter(string, CommandText, string connectionString)
इस Version को Use करके हम CommandText व Connection Object से सम्बंधित ConnectionString दोनों को String की तरह Specify करते हैं। ये एक ऐसा Version है, जिसका प्रयोग करने पर बिना कोई Extra Object Instantiate किए हुए एक ही Line के Code के माध्यम से Connection व Command दोनों को Setup करने की सुविधा मिलती है।
इस Program में DataAdapter daAuthors को Underlying DataSource के Data से Fill करने का काम Fill Method DataAdapter के Fill Method से किया गया है। इस Method का प्रयोग करके हम न केवल DataTable को Fill कर सकते हैं, बल्कि DataSet Object को भी Fill कर सकते हैं।
इसलिए यदि हमें किसी जरूरत को पूरा करने के लिए एक से ज्यादा DataTable Objects की जरूरत हो, जिसमें एक से ज्यादा Underlying Database के Tables के Data Filled हों, तो इस जरूरत को पूरा करने के लिए हम DataTable के स्थान पर DataSet Object भी Create कर सकते हैं। लेकिन केवल एक DataTable के साथ Interact करते समय हमें DataSet Object को Use नहीं करना चाहिए, बल्कि DataTable Object को Use करना चाहिए क्योंकि DataTable Object Memory में कम जगह Occupy करने की वजह से ज्यादा अच्छी Performance Provide करता है।
यदि हम उपरोक्त Code को थोडा और ध्यान से देखें तो हम समझ सकते हैं कि इस Code में Underlying SqlConnection को Open() Method का प्रयोग करते हुए Explicitly Open नहीं किया है। क्योंकि SqlDataAdapter स्वयं ही जब जरूरत होती है, तब Underlying DataSource के साथ Connection Establish करने के लिए Connection Open करता है और जरूरत पूरी हो जाने के साथ ही Connection को स्वं; ही Close भी कर देता है।
यानी जब DataTable या DataSet Object को Data से Fill करना होता है, तब SqlDataAdapter Object Underlying Data Source पर Connection को Open करता है और इन Objects को Fill करते ही जितना जल्दी सम्भव होता है, उतना जल्दी Connection को Close भी कर देता है। जिससे DataAdapter Object, Best Connection Pooling Scenario Allow करता है, जिसके अन्तर्गत “Connection को जितना देर से सम्भव होता है, उतना देर से Open किया जाता है जबकि जितना जल्दी सम्भव होता है, उतना जल्दी Close कर दिया जाता है।”
SqlDataAdapter की एक विशेषता ये भी है कि ये Connection को उसी स्थिति में रखता है, जिसमें Connection Object होता है। इसलिए यदि हम किसी जरूरत को पूरा करने के लिए Connection को Manually Open करते हैं, तो SqlDataAdapter उसे Close नहीं करता, बल्कि अपनी जरूरत पूरी करने के बाद भी उस Connection को Open ही रखता है। इस स्थिति में Connection को Close करने की जिम्मेदारी हमारी ही होती है।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF