C# DataSet Example

C# DataSet Example: जिस तरह से DataReader Object, Underlying Data Source के एक से ज्यादा Tables के Data को एक ही बार में Access व Manipulate करने की सुविधा Provide करता है, उसी तरह से हम DataAdapter का प्रयोग करते हुए भी Underlying DataSource से एक से ज्यादा Tables के Data से DataSets को Fill कर सकते हैं।

यहां तक कि हम DataAdapter का प्रयोग करते हुए न केवल कई Tables के Data को DataSet Object में Fill कर सकते हैं बल्कि उनके बीच की Relationship को भी DataRelation Object के माध्‍यम से Maintain रख सकते हैं। DataSet की इसी विशेषता के कारण DataSet Object एक प्रकार से In-Memory Mini-RDBMS Software की तरह Reflect होता है।

चूंकि जब हम DataAdapter Object के माध्‍यम से किसी DataSet Object को Underlying Database की Multiple Tables के Data से Fill करना चाहते हैं, तब हमें DataSet Object Declare करना होता है। इसलिए जब हम हमारे पिछले Program को DataSet Object के लिए Modify करते हैं, तब हमें DataTable Object के स्थान पर DataSet Object को Declare व Initialize करना पडता है।

चूंकि DataSet Object में Multiple Tables का समूह हो सकता है, इसलिए From पर स्थित DataGridView की DataSource Property को हम DataSet Object से Fill नहीं कर सकते। इस स्थिति में हमें हमारे पिछले Program में Specify किए गए DataGridView Object के Initialization Code को इस Program में थोडा Modify करना जरूरी हो जाता है।

DataSet Object को Multiple Tables के Data से Fill करने के लिए हम हमारे पिछले Program को कुछ निम्नानुसार तरीके से Modify कर सकते हैं, जबकि इस Code में हमने Frontend में दिखाई देने वाले Data से सम्बंधित Codes नहीं लि[ो हैं। यानी अपने Frontend के View Part को या Presentation Part को Specify नहीं किया है, इसलिए Form पर दिखाई देने वाले “Fill with Data” Button को Click करने पर DataGridView Control में कोई Data Fill नहीं होगा:

using System;
using System.Data;
using System.Data.Common;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace ManualCoding
{
    public partial class frmManualCoding : Form
    {
        private DataSet dsPubs;

        public frmManualCoding()
        {
            InitializeComponent();
            dsPubs = new DataSet();
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        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 publishers;" + "SELECT * FROM titles";
                SqlDataAdapter daAuthors = new SqlDataAdapter(comAuthors);
                daAuthors.Fill(dsAuthors);
            }
        }
    }
}

इस Code में सबसे ज्यादा महत्वपूर्ण Statement निम्नानुसार है:

        comAuthors.CommandText = “SELECT * FROM publishers;” + “SELECT * FROM titles”;

क्योंकि इस Code में हमने एक ही CommandText Property में दो SQL Statements को Specify किया है और दोनों ही SQL Statements एक ही बार में, Command Object Execute होने के साथ ही Execute हो जाते हैं, क्योंकि SQL Server किसी भी SQL Query का अन्त “;” Semicolon से मानता है। इसलिए उपरोक्त CommandText में Specified दोनों SQL Statements, Underlying SQL Server Database के लिए निम्नानुसार Convert होकर Execute होती हैं:

        SELECT * FROM publishers;SELECT * FROM titles

जिसे हम निम्नानुसार भी लिख सकते हैं:

        SELECT * FROM publishers;

        SELECT * FROM titles;

परिणामस्वरूप एक ही Command Execute होने पर Underlying Data Source पर उपरोक्तानुसार दो Queries Fire होती हैं, और दोनों Queries से Generate होने वाला Resultset Frontend Application को Return होता है।

इतना ही नहीं, यदि हम चाहें तो उपरोक्त दोनों Statements को एक ही बार में एक ही SQL Statement के रूप में Fire करने के लिए SQL Server में निम्नानुसार एक Stored Procedure Create कर सकते हैं:

Create Procedure GetMultipleResults
As
Begin
SELECT * FROM publishers;
SELECT * FROM titles;
End

और अपने Command Object में इस Stored Procedure को निम्नानुसार Statement के माध्‍यम से CommandText के स्थान पर Replace कर सकते हैं:

comPubs.CommandType = CommandType.StoredProcedure;
comPubs.CommandText = “GetMultipleResults”;

DataSet की एक विशेषता ये भी है कि हम किसी एक ही DataSet Object में Contained विभिन्न DataTable Objects में Multiple Different Data Sources के Data को Fill कर सकते हैं। परिणामस्वरूप दो एकदम अलग Databases की Tables के Data को एक ही DataSet Object में Contained दो अलग DataTable Object में Fill करके उन्हें Combined रूप से उपयोग में ले सकते हैं।

साथ ही हम एक ही DataSet Object में Contained विभिन्न DataTables के बीच In-Memory Relationship भी Maintain कर सकते हैं, जबकि हमें Underlying Data Source से में Contained Physical Tables के बीच की Actual Relationship को Maintain करने के लिए Underlying Data Source से Connected रहने की जरूरत नहीं रहती। यानी हम DataSet Object के माध्‍यम से Disconnected Mode में भी Underlying DataSource के Tables के बीच की Relationship को Maintain रख सकते हैं।

हालांकि हम दो अलग DataSets की DataTables के बीच आसानी से DataRelations Create नहीं कर सकते, बल्कि हमें दो अलग DbCommand Objects का प्रयोग करते हुए DataSet Object को Data से Fill करना होता है और Underlying Database को Data Capture करने के लिए दो बार Hit करना पडता है।

इसे समझने के लिए सबसे पहले एक नया Windows Forms Application Project Create करते हैं और निम्नानुसार Form Design करते हैं, जिस पर एक Combobox, एक DataGridView व दो Command Buttons Exist हैं:

C# DataSet Example - Hindi

इस Form द्वारा हम चाहते हैं कि Combobox Control हमारे DataSet Object की Publishers DataTable के Name से Fill हो जाए। जबकि DataGridView Control केवल उसी Table के Data Show करे, जिसे Combobox के माध्‍यम से Currently Select किया गया हो। साथ ही Form पर दिखाई देने वाले दोनों Buttons हमारे दोनों Controls के लिए Define होने वाले DataSet Objects को Fill करने का काम करें।

उपरोक्तानुसार Form Design करने के बाद इस Form पर Right Click करके Display होने वाले Popup Menu से “View Code” Option को Select करके इस Form के Code View में जाना होता है और Currently Inherited Form की Class में निम्नानुसार तरीके से एक नया Private DataSet Declare करके Constructor के अन्दर उसे Memory Allocate करना होता है:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace MultipleDataSet
{
    public partial class frmMultipleDataSet : Form
    {
        private DataSet dsPubs;

        public frmMultipleDataSet()
        {
            InitializeComponent();
            dsPubs = new DataSet();
        }
    }
}

अब हमें अपने Combobox Control को Data से Fill करने के लिए Event Handler Create करना होता है। इस Event Handler को Create करने के लिए हमें फिर से Form के Design पर जाना होता है और दिखाई देने वाले “Fill Publishers” Button को Double Click करना होता है। Double Click करते ही हमारे btnFillPublishers Button Object के लिए निम्नानुसार एक Event Handler Create हो जाता है:

private void btnFillPublishers_Click(object sender, EventArgs e)
{

}

अब हम इस Event Handler में निम्नानुसार Code लिख सकते हैं:

        private void btnFillPublishers_Click(object sender, EventArgs e)
        {
            string connectionString = "Data Source=.\\SQLSERVEREXPRESS;Initial Catalog=pubs;Integrated Security=True";

            using(SqlConnection conPubs = new SqlConnection(connectionString))
            {
                SqlCommand comPubs = new SqlCommand("SELECT * FROM publishers", conPubs);
                SqlDataAdapter daPubs = new SqlDataAdapter(comPubs);
                daPubs.Fill(dsPubs, "Publishers");
            }
            UpdateComboBox();
        }

जब हम हमारे Form पर दिखाई देने वाले “Fill Publishers” Button पर Click करते हैं, उपरोक्त Code Execute होता है और Underlying Data Source की “publishers” नाम की Table के Data को DataSet Object में एक DataTable के रूप में Fill कर देता है। साथ ही इस DataSet Object के Data को Combobox Control में Fill करने के लिए UpdateComboBox() Method को Call करता है। इस Method को निम्नानुसार तरीके से Define किया जा सकता है:

        private void UpdateComboBox()
        {
            cmbPublishers.Items.Clear();
            foreach (DataTable tblPublishers in dsPubs.Tables)
            {
                cmbPublishers.Items.Add(tblPublishers.TableName);
            }
        }

जब हम “Fill Publishers” Button को Click करते हैं तो सारा Code Execute होने के बाद जब UpdateComboBox() Method Execute होता है, तब सबसे पहले निम्न Code Execute होता है:

cmbPublishers.Items.Clear();

ये Code Execute होते ही Form पर स्थित Combobox में यदि पहले से कोई Item Exist हो, तो वह Clear कर देता है और फिर निम्नानुसार foreach Loop Execute होता है:

foreach (DataTable tblPublishers in dsPubs.Tables)

चूंकि DataSet Object में सभी DataTable Objects एक Collection की तरह Contained होते हैं, इसलिए Collection की सभी Tables को One-by-One Access करने के लिए हम उपरोक्तानुसार foreach Loop Use करते हैं। ये Loop dsPubs नाम के DataSet Object की सभी DataTables को Tables Property के माध्‍यम से One-by-One एक DataTable Object के रूप में Return करता है, जिसका Reference tblPublishers Object में Store कर दिया जाता है। फिर इस Method का निम्न Code Execute होता है:

cmbPublishers.Items.Add(tblPublishers.TableName);

ये Code tblPublishers Object में आने वाले Current DataTable Object के नाम को हमारे Form पर स्थित cmbPublishers नाम के Combobox में एक नए Item की तरह Add कर देता है। इस तरह से जैसे ही हम “Fill Publishers” Button को Click करते हैं, Publishers नाम की Table, हमारे Form पर स्थित Combobox Control में Add हो जाती है।

जिस तरह से हमने “Fill Publisher” Button के लिए Code लिखा है, उसी तरह से हम “Fill Titles” Button के लिए भी निम्नानुसार Code लिख सकते हैं, जबकि दोनों ही Codes में केवल CommandText Property में Specify किए जाने वाले SQL Statement व DataSet Object को इस नई Query से Generate होने वाले DataTable से Fill करने वाले Statement के अलावा अन्य किसी Statement में कोई अन्तर नहीं है:

        private void btnFillTitles_Click(object sender, EventArgs e)
        {
            string connectionString = "Data Source=.\\SQLSERVEREXPRESS;Initial Catalog=pubs;Integrated Security=True";

            using (SqlConnection conPubs = new SqlConnection(connectionString))
            {
                SqlCommand comPubs = new SqlCommand("SELECT * FROM titles", conPubs);
                SqlDataAdapter daPubs = new SqlDataAdapter(comPubs);
                daPubs.Fill(dsPubs, "Titles");
            }
            UpdateComboBox();
        }

दोनों ही Buttons के Event Handlers में हमने जिस Fill Method को Use किया है, उसमें दूसरे Argument के रूप में एक String Parameter Pass किया है, जो कि हमारी Table के नाम को Represent कर रहा है। यही नाम हमें हमारे Combobox Control में दिखाई देता है।

यदि हम चाहें तो अब अपने Program को Run कर सकते हैं। जब हम इसे Run करते हैं और दिखाई देने वाले Form पर स्थित किसी Button को Click करते हैं, तो उस Button से Associated Event Handler Execute होता है और Publishers या Titles नाम हमारे Combobox में Add हो जाता है। जैसे:

C# DataSet Example - Hindi

जैसाकि इस चित्र में दिखाई देने वाले Combobox में हम देख सकते हैं कि हमें “Titles” नाम दिखाई दे रहा है, क्योंकि हमने इस Form पर दिखाई देने वाले “Fill Titles” नाम के Button को Click किया है। अब यदि हम “Fill Publishers” नाम के Button को Click करें, तो हमें निम्न चित्रानुसार दोनों Tables के नाम इस Combobox में दिखाई देने लगेंगे-

C# DataSet Example - Hindi

हम समझ सकते हैं कि हालांकि दोनों ही Tables समान Underlying Database से आ रही हैं, लेकिन यदि हम दोनों Buttons के Event Handlers में Specify किए गए Connection को दो अलग Databases के लिए Specify करते, तब भी दो अलग Databases से आने वाली दो अलग Tables के नाम भी हमें इसी प्रकार से एक ही Combobox में दिखाई देते। क्योंकि DataSet Object, विभिन्न DataSource से आने वाले Tables के Data को एक Single DataSet Object की DataTables के रूप में Contain कर सकता है।

यदि हम चाहते हैं कि जैसे ही इस Combobox में किसी Table के नाम को Select किया जाए, उस Selected नाम की Table के Data हमें हमारे Form पर दिखाई देने वाले DataGridView Control में दिखाई दें, तो हमें हमारे Combobox के SelectedIndexChanged Event को Use करते हुए निम्नानुसार Event Handler Define करना होगा:

        private void cmbPublishers_SelectedIndexChanged(object sender, EventArgs e)
        {
            dgvPubs.DataSource = dsPubs.Tables[cmbPublishers.SelectedIndex];
        }

ये Event Handler Create करने के लिए भी हमें Design View में दिखाई देने वाले Combobox Control को Double Click करना होता है। जैसे ही हम Combobox को Double Click करते हैं, उपरोक्तानुसार SelectedIndexChanged Event के लिए एक Event Handler Create हो जाता है। इस Event Handler में लिखा गया Code इस तरह से काम करता है कि जैसे ही हम Combobox की List में दिखाई देने वाले किसी Table के नाम को Select करते हैं, ये Event Handler Execute हो जाता है।

Combobox में Table का नाम जिस Index Position पर होता है, उस Index Position वाली Table को DataSet Object में Select करके उसे DataGridView Control की DataSource Property में Set करने का काम निम्न Statement द्वारा Perform होता है:

dgvPubs.DataSource = dsPubs.Tables[cmbPublishers.SelectedIndex];

परिणामस्वरूप हम जैसे ही Combobox में किसी Table के नाम को Select करते हैं, निम्न चित्रानुसार उस Table के Data, Form पर स्थित DataGridView Control में Fill हो जाते हैं:

C# DataSet Example - Hindi

इस तरह से यदि हम उपरोक्त सभी Codes को एक Single File के रूप में Specify करें, तो हमारे उपरोक्त Form का Code View निम्नानुसार हो सकता है:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace MultipleDataSet
{
    public partial class frmMultipleDataSet : Form
    {
        private DataSet dsPubs;

        public frmMultipleDataSet()
        {
            InitializeComponent();
            dsPubs = new DataSet();
        }

        private void btnFillPublishers_Click(object sender, EventArgs e)
        {
            string connectionString = "Data Source=.\\SQLSERVEREXPRESS;Initial Catalog=pubs;Integrated Security=True";

            using(SqlConnection conPubs = new SqlConnection(connectionString))
            {
                SqlCommand comPubs = new SqlCommand("SELECT * FROM publishers", conPubs);
                SqlDataAdapter daPubs = new SqlDataAdapter(comPubs);
                daPubs.Fill(dsPubs, "publishers");
            }
            UpdateComboBox();
        }

        private void UpdateComboBox()
        {
            cmbPublishers.Items.Clear();
            foreach (DataTable tblPublishers in dsPubs.Tables)
            {
                cmbPublishers.Items.Add(tblPublishers.TableName);
            }
        }

        private void btnFillTitles_Click(object sender, EventArgs e)
        {
            string connectionString = "Data Source=.\\SQLSERVEREXPRESS;Initial Catalog=pubs;Integrated Security=True";

            using (SqlConnection conPubs = new SqlConnection(connectionString))
            {
                SqlCommand comPubs = new SqlCommand("SELECT * FROM titles", conPubs);
                SqlDataAdapter daPubs = new SqlDataAdapter(comPubs);
                daPubs.Fill(dsPubs, "titles");
            }
            UpdateComboBox();
        }

        private void cmbPublishers_SelectedIndexChanged(object sender, EventArgs e)
        {
            dgvPubs.DataSource = dsPubs.Tables[cmbPublishers.SelectedIndex];
        }
    }
}

इस प्रोग्राम को Compile व Run करके आप इसका Effect देख सकते हैं।

ADO.NET with C# in Hindi - BccFalna.com: TechTalks in Hindi ये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

ADO.NET with C# in Hindi | Page:501 | Format: PDF

BUY NOW GET DEMO REVIEWS