Execute Scalar – ADO.NET Command Object

Execute Scalar: जैसाकि हमने पिछले Chapter में Detail से Discuss किया, जब एक बार Underlying Data Source के साथ Connection Establish हो जाता है, तो Data Source के साथ Communicate करने में दो Operations Involved होते हैं:

  • Frontend Application Underlying Data Source के जिस Data को Access करना चाहता है उसे Identify करना और
  • Identified Result को Retrieve करना।

पहले Step के अन्तर्गत Underlying Data Source पर एक Command या Request को किसी Predefined Language या Format में Send करना होता है। हालांकि ADO.NET किसी Particular Language या Syntax को बाध्‍य नहीं करता, लेकिन फिर भी Data Source से Query किए जाने वाले Data को Retrieve करने के लिए SQL (Structured Query Language) को Preferred Language के रूप में Use किया जाता है।

Underlying Data Source पर Query Perform करने के लिए MS-SQL Server T-SQL नाम की Query Language को Support करता है, जबकि Oracle, PL/SQL को Support करता है। दोनों ही Languages, Text-Based Languages हैं और दोनों के ही Syntaxes व Purposes काफी हद तक एक समान हैं, जिनके अन्तर्गत मूल रूप से DDL, DML, TCL जैसे Commands होते हैं।

Retrieving Single Result with ExecuteScalar() Method

जब हम Underlying Data Source से Frontend में Data Retrieve करना चाहते हैं, तो SQL हमें कई तरीकों से Value Retrieve करने के लिए विभिन्न प्रकार के SQL Commands Provide करता है। जहां Scalar Values ऐसी Values होती हैं, जो कि किसी Single Data जैसे कि Integer, Floating Point Value, Character आदि को Represent करता है।

अपने Frontend के माध्‍यम से Underlying Database से Data की Query करने के लिए हमें हमेंशा ADO.NET के Command Object को Use करना होता है। हालांकि इस पुस्तक में हमारा ज्यादातर Discussion पूरी तरह से SQL Server के ADO.NET Data Provider पर आधारित है, लेकिन ये सारा Discussion Oracle या किसी अन्य ODBC/OleDb Data Provider पर भी समान रूप से Apply होता है।

Creating Command Object

ADO.NET में Generic Command Object को DbCommand Class द्वारा Represent किया जाता है, जबकि MSSQL Server या Oracle Specific Command Object को क्रमश: System.Data.SqlClient.SqlCommand या System.Data.OracleClient.OracleCommand द्वारा Represent किया जाता है जो कि DbCommand Class से Inherit होते हैं। Inheritance की इस स्थिति को हमने दूसरे Chapter में एक चित्र द्वारा भी Represent किया था।

Command Object Create करना काफी आसान है। Command Object Create करने के लिए हमें केवल चार Supported Overloaded Constructors को Use करना होता है। जैसे:

        SqlCommand testCommand = new SqlCommand();

हालांकि ये Statement कुछ Special काम नहीं करता। लेकिन चूंकि हम किसी Command द्वारा किसी Specific SQL Query को Underlying Database पर Fire करना चाहते हैं, ताकि Frontend Application Underlying Data Source के Data को Access व Manipulate कर सके, इसलिए हमें हमारे Command के साथ ही Underlying Database को Represent करने वाले Connection ObjectSQL Query को भी Specify करना होता है।

Configuring Command Object

Command Object को जिस Connection Object के लिए Use करना है, उसे Specify करने के लिए हम हमारे Newly Created Command Object की Connection Property को निम्नानुसार तरीके से Set कर सकते हैं:

        testCommand.Connection = testConnection;

जबकि यदि हम चाहें तो Command Object Create करते समय ही उसकी Connection Property को निम्नानुसार तरीके से Command Constructor के माध्‍यम से भी Set कर सकते हैं:

        SqlCommand testCommand = new SqlCommand(“Command Text”, testConnection);

साथ ही हम Connection Object के साथ CreateCommand() Method का प्रयोग करते हुए भी निम्नानुसार यही काम कर सकते हैं:

        SqlConnection testConnection = new SqlConnection();

        SqlCommand testCommand = testConnection.CreateCommand();

यानी हम कुल तीन तरीकों से Command Object के साथ उस Connection Object को Set कर सकते हैं, जिसके लिए Command Object में Specified SQL Query को Underlying Database पर Execute करते हुए Data Source से Required Result Generate करना है।

चूंकि हम Command Object को Independent तरीके से Create करते हैं, इसलिए हम एक ही Command Object को अपनी जरूरत के अनुसार अलग-अलग Connection के लिए बार&बार Reuse कर सकते हैं।

उपरोक्त तीन तरीकों के अलावा हम एक और तरीके का प्रयोग करके भी Command Object Create कर सकते हैं, जिसके अन्तर्गत हम किसी Transaction को भी Command Object में Specify करने की क्षमता प्राप्त कर लेते हैं। परिणामस्वरूप इस प्रकार के Command Object में हम उस SQL Command को भी Specify कर सकते हैं, जिसे Command Object के माध्‍यम से Execute करना है। जैसे:

        SqlCommand testCommand = new SqlCommand(“…”, testConnection, Transaction);

जब हम Command Object के साथ उपरोक्तानुसार विभिन्न तरीकों का प्रयोग करके इस बात को Specify कर देते हैं कि हमें हमारे Command Object को किस Connection Object के लिए Execute करना है, उसके बाद हमें इस बात को Specify करना होता है कि हमें Underlying Data Source से किस प्रकार के Data को Retrieve करना है।

यानी Command Object को Connection Object से Attach करने के बाद अब हमें Command Object द्वारा Underlying Database पर Execute किए जाने वाले SQL Command को Specify करना होता है, जिसे Command Text के नाम से जाना जाता है।

उदाहरण के लिए यदि हम हमारे pubs नाम के Database की authors नाम की Table से कुल Authors की संख्‍या प्राप्त करना चाहें, तो हमारा SQL Statement कुछ निम्नानुसार होगा:

        SELECT COUNT(*) FROM authors

और इस SQL Query को Command Object में कुछ निम्नानुसार तरीके से Embed किया जाएगा:

        SqlCommand testCommand = new SqlCommand(

                “SELECT COUNT(*) FROM authors”,

                testConnection

        );

जबकि यदि हम चाहें तो इसी Statement को कुछ निम्नानुसार तरीके से भी लिख सकते हैं:

        SqlCommand testCommand = new SqlCommand(“SELECT COUNT(*) FROM authors”);

        testCommand.Connection = testConnection;

Command Object Create करके Execute होने वाले Command Text को Specify करने तथा Command Object को किसी Connection Object के साथ Attach करने के बाद अब हमें ये बताना होता है कि हमारे Command Object द्वारा जो Command Text Execute किया जाना है, उसका Type क्या है और इस Type को Specify करने के लिए हमें Command Object की CommandType Property को Use करना होता है।

सामान्यत: Default रूप से CommandType Property का मान CommandType.Text होता है, जो कि किसी String Formatted SQL Query को Represent करता है। जबकि यदि हम हमारे Command Object के माध्‍यम से किसी Stored Procedure को Execute करना चाहें, तो CommandType Property में हमें CommandType.StoredProcedure मान Specify करना होता है।

Executing Command

पिछले Sections में हमने Command Object Create करने व Command Object को Underlying Data Source से Required Result प्राप्त करने के लिए Configure करने के बारे में जाना। लेकिन जब तक हम किसी Command को Execute नहीं करते, तब तक वह Command Underlying Data Source के साथ किसी भी तरह का Interaction करते हुए Result Generate नहीं करता।

जैसाकि हमने पिछले Chapter में Discuss किया था कि SqlConnection Class, DbConnection Class को Inherit करता है, जिसमें IDbConnection Interface को Implement किया गया होता है और क्योंकि Common रूप से Use होने वाले ADO.NET Objects समान Programming Paradigm को Follow करते हैं, इसलिए Command Class, IDbCommand Interface को Implement करने के साथ ही DbCommand Class को Inherit भी करता है।

वास्तव में DbCommand Class, IDbCommand Interface को Implement करता है, जिसका मतलब ये भी है कि ExecuteScalar() Method, SqlCommand Class के माध्‍यम से ऐसा Command Execute करने के लिए भी Accessible है, जो कि Result के रूप में केवल एक Single मान Return करता है।

जबकि Single Result के रूप में केवल एक Value ही हो सकता है, Results का पूरा Set नहीं। इसलिए ExecuteScalar() Method ही वह Method है, जिसका प्रयोग करके हम pubs नाम के Database में Exist authors नाम के Table में Stored कुल Records यानी Authors की संख्‍या Retrieve कर सकते हैं। लेकिन इससे पहले कि हम ExecuteScalar() Method को Call करें, हम जिस Connection के लिए Command को Execute करना चाहते हैं, उसका Open होना जरूरी होता है अन्यथा ADO.NET एक Exception Throw करता है।

इस स्थिति में हमें इस Method को Execute करने से पहले उस Underlying Data Source के लिए Connection को Open करना होता है, जिसके लिए हमें Connection Object के साथ Open() Method को Use करना होता है।

Connection Open करने के बाद जब हम ExecuteScalar() Method को Call करते हैं, तो ये Method एक Object Data Type का मान Return करता है, जिसे Type Cast करते हुए निम्नानुसार तरीके से किसी Integer Type के Variable में Store किया जाता है, क्योंकि Underlying Database से Return होने वाला मान एक Numerical मान होता है।

        int totalAuthors = (int) testCommand.ExecuteScalar();

इस प्रकार से यदि हम उपरोक्त सभी Code Segments को एक Program के रूप में Create करें, तो हमारा Program कुछ निम्नानुसार होगा:

using System;
using System.Data;
using System.Data.SqlClient;

namespace DBApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnectionStringBuilder sqlConBuilder = new SqlConnectionStringBuilder
			("Data Source=.\\SQLSERVEREXPRESS;Initial Catalog=pubs;Integrated Security = true");

            SqlConnection testConnection = new SqlConnection(sqlConBuilder.ToString());
            SqlCommand testCommand = new SqlCommand
			("SELECT COUNT(*) FROM authors", testConnection);

            try
            {
                testConnection.Open();
                if(testConnection.State == ConnectionState.Open)
                {
                    int totalAuthors = (int)testCommand.ExecuteScalar();
                    Console.WriteLine("Total Authors: " + totalAuthors);
                }
            }
            catch(Exception)
            {
                Console.WriteLine("Connection Failed on SQL Server Data Source.");
            }
            finally
            {
                // Closing a connection ensures connection pooling.
                if (testConnection.State == ConnectionState.Open)
                {
                    testConnection.Close();
                }
                testConnection.Dispose();
                }
            }
        }
    }

जब हम इस Program को Run करते हैं, तो हमें निम्नानुसार Output प्राप्त होता है:

Execute Scalar - ADO.NET Command Object - Hindi

जहां हम देख सकते हैं कि pubs नाम के हमारे Database की authors नाम की Table में कुल 23 Records हैं, जो कि 23 Authors को Represent कर रहे हैं। इसी Program को यदि हम चाहें तो निम्नानुसार using Block का प्रयोग करके भी Create कर सकते हैं:

using System;
using System.Data;
using System.Data.SqlClient;

namespace DBApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnectionStringBuilder sqlConBuilder = new SqlConnectionStringBuilder
			("Data Source=.\\SQLSERVEREXPRESS;Initial Catalog=pubs;Integrated Security = true");

            SqlConnection testConnection = new SqlConnection(sqlConBuilder.ToString());
            SqlCommand testCommand = new SqlCommand
			("SELECT COUNT(*) FROM authors", testConnection);

            using (testConnection)
            {
                testConnection.Open();
                int totalAuthors = (int)testCommand.ExecuteScalar();
                Console.WriteLine("Total Authors: " + totalAuthors);
            }
        }
    }
}

जब हम using Block का प्रयोग करते हैं, तब हमें Create किए जाने वाले Connection Object को Close करने के लिए Close() Method अथवा Connection Object के Resources को Free करने के लिए Dispose() Method को Use करने की जरूरत नहीं होती, बल्कि ये काम .NET CLR स्वयं ही अपने स्तर पर Automatically करता रहता है।

हमें केवल इतना ही करना होता है कि using के साथ Specified Parenthesis के बीच हमें उस Object को Specify करना होता है, जिसके Resources को Automatically Collect करने के लिए Specify करना है, जैसाकि हमने इसके Parenthesis के बीच testConnection Object को Specify किया है, क्योंकि हम हमारे Connection Object द्वारा Occupied Resources को Automatically Free करना चाहते हैं।

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