Connection String Examples: कोई भी Database Application ऐसा नहीं हो सकता, जिसके Data को Store करने के लिए किसी भी प्रकार का Data Source Exist न हो। यदि हम Computer को एक Information Processing व Storage Machine मानें] तो Data Storage के लिए हमेंशा किसी न किसी Data Source की जरूरत होती है। Data Source के रूप में Microsoft Access जैसा सरल DBMS Software भी हो सकता है और MSSQL Server या Oracle जैसा Complete Enterprise Solution भी हो सकता है।
जब हम .NET Platform Based Database Application की बात करते हैं, तब Backend Database के रूप में चाहे जो भी DBMS Software हो, उसे Frontend से Connect करने के लिए हमेंशा ADO.NET Architecture का प्रयोग किया जाता है।
ADO.NET हमें ये सुविधा देता है कि हम Suitable Connection Object का प्रयोग करके किसी भी प्रकार के Data Source के साथ Frontend को Connect कर सकते हैं। चूंकि MSSQL Server भी .NET Framework की तरह ही Microsoft का ही Product है, इसलिए MSSQL Server किसी भी .NET Based Database Application के लिए सबसे ज्यादा Suitable Data Source होता है और SQL Server से Connection स्थापित करने के लिए ADO.NET हमें SqlConnection नाम का Class Provide करवाता है, जिसके माध्यम से हम .NET Frontend को SQL Server के साथ Connect करते हैं।
हम चाहे जो भी Data Source Use करें, उन सभी Data Sources से Connection Implement करने के लिए हमें कुछ Common Characteristics को उपयोग में लेना होता है। चूंकि विभिन्न प्रकार के Data Sources से Connection स्थापित करने के लिए हमें ADO.NET के Connection Object में विभिन्न प्रकार के Server Name, User ID, Password आदि Information को Specify करना होता है जो कि अलग-अलग Data Sources के लिए अलग-अलग हो सकते हैं। इसलिए ADO.NET हमें एक ऐसा Common व Flexible Mechanism Provide करता है, जिसके अन्तर्गत हम इन सभी जरूरी व Common Information को Key-Value Pair के रूप में Specify करते हैं। जैसे:
“parametername1=parametervalue1;parametername2=parametervalue2;…”
जिस तरह से हम Data Source पर Connection Open करने के लिए विभिन्न प्रकार के जरूरी Basic Configurations को Specify करते हैं, उसी तरह से हमें किसी Opened Connection को Close भी करना होता है।
साथ ही किसी Data Source पर किसी Specific Operation को Perform करने के बाद अथवा Operation Perform करने के दौरान हमें इस बात की भी जानकारी की जरूरत होती है कि Open किए गए Connection की Currently क्या स्थिति है।
इसलिए ADO.NET द्वारा किसी Data Source के साथ Frontend के माध्यम से प्रक्रिया करते समय हमें Open() व Close() नाम के दो Methods तथा State नाम की एक Property Provide किया जाता है, जिनके माध्यम से हम Data Source से Data Interaction करने के लिए जरूरी Controls प्राप्त कर पाते हैं। चलिए, इस प्रक्रिया को हम आसानी से समझने के लिए कुछ उदाहरण व Code Segments देखते हैं।
Creating Connection Objects
जैसाकि हम जानते हैं कि ADO.NET हमें Connection नाम की एक Class Provide करता है, जिसका प्रयोग करके हम किसी Specific Data Source के साथ Connection Establish करने की क्षमता प्राप्त करते हैं। इसे समझने के लिए हम एक उदाहरण देख सकते हैं।
मानलो कि हम हमारे Local Computer पर Installed SQL Server के साथ अपने Client Program का Connection Establish करना चाहते हैं। इस जरूरत को पूरा करने के लिए हम हमारे Program में ADO.NET के SqlConnection Class को निम्नानुसार तरीके से Use कर सकते हैं:
SqlConnection testConnection = new SqlConnection();
SqlConnection Object Create करने के बाद हमे इस Object की ConnectionString Property को Use करना होता है जो कि एक String Property होता है और इस Property में हमें हमारे उस SQL Server Data Source से सम्बंधित Server, User ID व Password जैसे Credentials को Specify करना होता है, जिससे हम हमारे Client Program को Connect करना चाहते हैं। इस जरूरत को निम्नानुसार तरीके से पूरा किया जा सकता है:
string testConnectionString =
“Data Source=.\SQLSERVEREXPRESS;
Initial Catalog=pubs;
Integrated Security=True”
जहां Data Source के रूप में हमें हमारे SQL Server Database के Server व Instance के नाम को Specify करना होता है। ये वही नाम होता है, जिसे हमने पिछले Section में “Add Connection” Dialog Box पर प्राप्त किया था।
यदि हम चाहें तो Local SQL Server को Represent करने के लिए .\SQLSERVEREXPRESS के स्थान पर (local)\SQLSERVEREXPRESS भी लिख सकते हैं जो कि Local Computer पर Installed SQL Server को ही Represent करता है। जबकि Initial Catalog के रूप में हमें हमारे उस Database को Specify करना होता है, जिससे हम हमारे Newly Created testConnection Object को Connect करना चाहते हैं।
चूंकि हम हमारे Client Program को SQL Server में पिछले Section में Discussed तरीके से Installed pubs नाम के Database को Access करना चाहते हैं, इसलिए इस Initial Catalog Parameter के रूप में pubs मान Specify किया है।
उपरोक्त Connection String को Manually लिखने के स्थान पर बेहतर यही होता है कि हम पिछले Section में Visual Studio के अन्तर्गत Exist Server Explorer Tab के रूप में Specified “Add Connection” Dialog Box का ही प्रयोग करें और Connection के Successful होने की स्थिति में जो Connection String Create होता है, उसी Connection String को उपयोग में लें, जो कि Create किए गए Connection को Select करने पर Visual Studio के IDE में Properties Tab के अन्तर्गत निम्न चित्रानुसार दिखाई देता है:
इस Connection String को Use करने का फायदा ये है कि हम इस बात के लिए आश्वस्त हो सकते हैं कि हमारा Connection String पूरी तरह से Working व सही है।
जब एक बार हमारी Connection String Create हो जाती है, उसके बाद हमें इस Connection String को Create किए गए Connection Object की ConnectionString Property में Assign करना होता है और इस काम को निम्नानुसार पूरा किया जाता है:
testConnection = testConnectionString;
इस प्रकार से अब यदि हम हमारे Frontend Program को Backend SQL Server Database से Connect करने सारे Statements को एक साथ Specify करें, तो हमारा Code कुछ निम्नानुसार होगा:
SqlConnection testConnection = new SqlConnection();
string testConnectionString =
“Data Source=.\SQLSERVEREXPRESS;
Initial Catalog=pubs;
Integrated Security=True“
testConnection = testConnectionString;
Frontend Program का Backend Data Source से Connection Establish करने का एक और आसान व कम Coding वाला तरीका ये है कि हम Connection Object Create करते समय ही उसके Constructor में Parameter की तरह ConnectionString को Specify कर सकते हैं। जैसे:
SqlConnection testConnection = new SqlConnection(
“Data Source=.\SQLSERVEREXPRESS;
Initial Catalog=pubs;
Integrated Security=True“);
जब हम इस प्रकार से Connection Object Create करते हैं, तो Create होने वाले Connection Object के साथ Directly Open() Method को Call करके Frontend Program का Backend Database पर Connection Open किया जा सकता है।
यहां एक बात विशेष रूप से ध्यान रखने वाली ये है कि हम उपरोक्तानुसार Code द्वारा जो Connection Open करते हैं, वह Connection एक प्रकार का Logical Connection ही होता है Physical नहीं।
इसलिए जब हम उपरोक्तानुसार तरीके से Connection Object Create करके उसके साथ Open() Method का प्रयोग करते हुए Backend Database के साथ Connection Open करते हैं, तो ये Connection Object या तो पहले से Open किए गए किसी Physical Connection के Connection Pooling का प्रयोग कर लेता है जो कि लगभग सभी Data Providers के लिए ON रहता है अथवा Connection Pooling के रूप में पहले से कोई Connection Available न हो, तो SQL Server द्वारा एक Brand New Connection Open किया जाता है।
पिछले Code द्वारा हमने जो Connection Open किया है, उसी Connection का प्रयोग करते हुए हम निम्नानुसार तरीके से एक Console Mode Example Program Create कर सकते हैं, जो कि Local SQL Server पर Exist हमारे “pubs” नाम के Database से विभिन्न Authors की Information को Access and Manipulate करने में सक्षम होता है।
Console Mode Application Create करने के लिए हम Visual Studio IDE में “FILE => New => Project…” Option को Click करते हैं, जिससे हमारे सामने निम्नानुसार एक “New Project” Dialog Box Display होता है।
इस Dialog Box में हम Left Side में Specified “Visual C#” Template को Select करते हैं और दिखाई देने वाले विभिन्न Project Types में से निम्न चित्र में दर्शाए अनुसार “Console Application” को Select करते है तथा Newly Create होने वाले Console Application का Name, Location, Solution व Solution name Specify करने के बाद OK Button पर Click करते हैं:
OK Button पर Click करते ही हमारे सामने एक नया Program File Display होता है, जिसमें हमें हमारे Backend Database से Connection Establish करने से सम्बंधित Codes लिखने होते हैं।
चूंकि हमारा Console Mode Application एक Frontend .NET C# Program है और .NET Program में ADO.NET के माध्यम से Backend Database को Frontend से Connect किया जाता है, इसलिए Current Program में ADO.NET की Functionalities प्राप्त करने के लिए हमें सबसे पहले अपने Program में System.Data.SqlClient Namespace को using Keyword के साथ Specify करना होता है।
इतना ही नहीं Database Related विभिन्न Data Providers द्वारा Provide की जाने वाली Common Functionalities को ADO.NET के System.Data Namespace में Specify किया गया होता है, इसलिए Current Program को Normal तरीके से Run करने के लिए जरूरी है कि हमारे Current Program में इस Namespace को भी using Keyword के साथ Specify किया जाए।
System.Data व System.Data.SqlClient Namespace को Current Program में Specify करने के बाद Create होने वाले Program में हम हमारे Connection Establishing Codes को निम्नानुसार लिख सकते हैं:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Data.SqlClient; namespace DBApplication { class Program { static void Main(string[] args) { SqlConnection testConnection = new SqlConnection( "Data Source=(local)\\SQLSERVEREXPRESS; Initial Catalog=pubs; Integrated Security=True"); try { testConnection.Open(); if(testConnection.State == ConnectionState.Open) { Console.WriteLine("Connection opened successfully on SQL Server Data Source."); } } 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 में हम देख सकते हैं कि सबसे पहले हमने Main() Method में निम्नानुसार तरीके से एक SqlConnection Object Create किया है जिसमें Connection String को Parameter की तरह Pass किया है:
SqlConnection testConnection = new SqlConnection( "Data Source=(local)\\SQLSERVEREXPRESS; Initial Catalog=pubs; Integrated Security=True");
इस Statement में Connection String में हमने Data Source Parameter में Double Slash का प्रयोग इसलिए किया है, क्योंकि C# में Slash एक Character Constant Specify करने वाला Special Character होता है। इसलिए यदि हम Single Slash Specify करते हैं, तो C# Program Error Generate करता है। जबकि यदि हम इसी Connection String को VB.NET में Specify करते, तो हमें Single Slash का ही प्रयोग करना होता। जैसे:
Dim testConnection As SqlConnection = New ( "Data Source=(local)\SQLSERVEREXPRESS; Initial Catalog=pubs; Integrated Security=True");
Connection Object Create करने के बाद हमने Create होने वाले Connection Object को निम्नानुसार try Block में Open किया है, क्योंकि यदि किसी कारणवश Connection Normal तरीके से Open नहीं होता, तो ये Method एक Exception Generate करता है:
try { testConnection.Open(); if(testConnection.State == ConnectionState.Open) { Console.WriteLine("Connection opened successfully on SQL Server Data Source."); } }
जब हम Connection Open करते हैं तो Connection के Normal तरीके से Open होने की स्थिति में Connection Object की State Property में ConnectionState.Open मान Store होता है। इसलिए एक if Statement में इसी बात को Check किया गया है कि क्या Connection Normal तरीके से Open हुआ है या नहीं। यदि Connection Normal तरीके से Open होता है, तो if Statement Execute होता है और Output में हमें Connection के Successful होने का Message प्राप्त होता है।
लेकिन यदि किसी कारणवश Connection Normal तरीके से Open न हुआ हो, तो ये if Statement Fail हो जाता है। परिणामस्वरूप एक Exception Throw होता है, जिसे निम्नानुसार catch Code द्वारा Catch किया जाता है:
catch(Exception) { Console.WriteLine("Connection Failed on SQL Server Data Source."); }
परिणामस्वरूप हमें Output में Connection Fail होने का Message प्राप्त होता है। जबकि Connection चाहे Normal तरीके से Open हुआ हो चाहे किसी कारणवश Fail हो गया हो, दोनों ही स्थितियों में निम्नानुसार finally Block Execute होता है:
finally { // Closing a connection ensures connection pooling. if (testConnection.State == ConnectionState.Open) { testConnection.Close(); } testConnection.Dispose(); } }
जहां एक if Statement द्वारा इस बात को Check किया जाता है कि Connection Open है या नहीं। यदि Connection Open हो, तो Connection Object के लिए Close() Method को Invoke करके Connection को Close किया जाता है और अन्त में Connection द्वारा Occupied Resources को Free करने के लिए Connection Object के लिए Dispose() Method को Invoke किया जाता है। जबकि Connection Open न होने की स्थिति में सीधे ही Dispose() Method का प्रयोग करके Connection Object द्वारा Occupied Resources को Free कर दिया जाता है।
इस प्रकार से C# में किसी Backend Database के साथ Connection Establish करने के लिए हमें हमेंशा उपरोक्तानुसार try … catch Block को Use करना होता है, जो कि Database Application में Backend Database के साथ काम करने का सबसे व्यवस्थित व उपयुक्त तरीका है।
DbConnectionStringBuilder
जैसाकि हम उपरोक्त Connection String Code द्वारा समझ सकते हैं कि Backend Database के साथ Connection स्थापित करने के लिए हमें विभिन्न प्रकार के जरूरी Credentials को Key-Value Pair के रूप में Specify करना होता है। हमारे इस उदाहरण में हमने केवल Data Source, Initial Catalog व Integrated Security नाम के तीन Parameters को ही Specify किया है।
जबकि Oracle या SQL Server जैसे Enterprise Level के Data Sources को उपयोग में लेते समय हमें Connection String में और भी कई Parameters को Specify करने की जरूरत पड सकती है। इस स्थिति में एकदम Valid Connection String Specify करना काफी जटिल काम हो जाता है। इस Complexity से बचने के लिए ADO.NET हमें एक बहुत ही Generic Features Provide करता है।
ADO.NET हमें DbConnectionStringBuilder नाम की एक Class Provide करता है। इसके Object में हम Connection String Related विभिन्न Parameters ज्यादा बेहतर तरीके से Specify कर सकते हैं।
हर .NET Data Provider एक Class Provide करता है जो कि DbConnectionStringBuilder Class से Derive होता है और हम इस Class के Object का प्रयोग करके उस Particular Data Source से सम्बंधित Connection String Parameters को बेहतर तरीके से Specify कर सकते हैं।
उदाहरण के लिए OracleClient हमें OracleConnectionStringBuilder नाम की Class Provide करता है जबकि SqlClient हमें SqlConnectionStringBuilder नाम की Class Provide करता है, जिनका प्रयोग करके हम क्रमश: Oracle या SQL Related विभिन्न Connection String Parameters को Specify कर सकते हैं।
चूंकि SqlConnectionStringBuilder Class, SQL Server Database से सम्बंधित Connection Strings के विभिन्न Parameters को Handle करने का काम करता है, इसलिए यदि हम इस Class का Object Use करते हैं, तो हमें Connection String में Specify किए जाने वाले विभिन्न Parameters को Manually Set करने की जरूरत नहीं होती, जैसाकि हमने पिछले Program में किया है।
बल्कि हम Visual Studio IDE के Intellisense Feature का प्रयोग करते हुए Connection String के विभिन्न Parameters को निम्नानुसार तरीके से Specify कर सकते हैं, जहां हमें Data Provider के किसी Parameter को याद रखने की जरूरत नहीं होती, बल्कि सभी Parameters, Visual Studio में निम्न चित्रानुसार Automatically Display होते रहते हैं:
परिणामस्वरूप हम हमारे Database से सम्बंधित विभिन्न Parameters को निम्नानुसार तरीके से String Builder Object में Specify कर सकते हैं:
SqlConnectionStringBuilder sqlConBuilder = new SqlConnectionStringBuilder();
sqlConBuilder.DataSource = “.\\SQLSERVEREXPRESS”;
sqlConBuilder.InitialCatalog = “pubs”;
sqlConBuilder.IntegratedSecurity = true;
जब हम Connection String के विभिन्न Parameters को इस प्रकार से DbConnectionStringBuilder Class के Object के माध्यम से Set करते हैं, तब नया Connection Object Create करते समय हमें Connection Constructor में Parameter के रूप में इस String Builder Object को Pass करना होता है।
लेकिन क्योंकि Connection Constructor Argument के रूप में एक String Parameter ही Accept करता है, इसलिए इस String Builder Object को Connection Constructor में Pass करते समय हमें इसे निम्नानुसार तरीके से ToString() Method के साथ Specify करते हुए Specify करना होता है:
SqlConnection testConnection = new SqlConnection(sqlConBuilder.ToString());
इस तरह से यदि हम हमारे पिछले Program को ही उपरोक्तानुसार String Builder Class का प्रयोग करते हुए Modify करें, तो हमारा Program कुछ निम्नानुसार होगा:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Data.SqlClient; namespace DBApplication { class Program { static void Main(string[] args) { SqlConnectionStringBuilder sqlConBuilder = new SqlConnectionStringBuilder(); sqlConBuilder.DataSource = ".\\SQLSERVEREXPRESS"; sqlConBuilder.InitialCatalog = "pubs"; sqlConBuilder.IntegratedSecurity = true; SqlConnection testConnection = new SqlConnection(sqlConBuilder.ToString()); try { testConnection.Open(); if(testConnection.State == ConnectionState.Open) { Console.WriteLine("Connection opened successfully on SQL Server Data Source."); } } 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 करते हैं, तो हमें पिछले Program के अनुसार ही निम्नानुसार Output देता है:
SqlConnectionStringBuilder Class के Object का प्रयोग करके हम SQL Server के Connection String से सम्बंधित विभिन्न Parameters को याद रखने की परेशानी से तो बच ही जाते हैं। इसके अलावा इस Class का एक और फायदा ये है कि DbConnectionStringBuilder Class से Inherit होने वाली हर Class Connection String व Database के Description के बीच एक प्रकार के Bridge की तरह काम करता है।
इसलिए यदि हमारे पास पहले से किसी Database की Connection String उपलब्ध हो, तो हम उस String को SqlConnectionStringBuilder Class के Object के रूप में Convert कर सकते हैं अथवा उस Connection String को SqlConnectionStringBuilder Class में Constructor की तरह Pass कर सकते हैं। जैसे:
SqlConnectionStringBuilder sqlConBuilder = new SqlConnectionStringBuilder(
“Data Source=.\\SQLSERVEREXPRESS;
Initial Catalog=pubs;
Integrated Security = true”);
SqlConnection testConnection = new SqlConnection(sqlConBuilder.ToString());
यदि हम SqlConnectionStringBuilder के Constructor में इस प्रकार से Connection String को Specify करते हैं, तो ये Class Automatically स्वयं ही सभी Appropriate Parameters को Populate कर लेता है।
हालांकि यहां हमने SqlClient के लिए SqlConnectionStringBuilder Class को Use किया है, जबकि यदि हम चाहें तो OracleClient Server के लिए इसी तरह से OracleConnectionStringBuilder Class को Use कर सकते हैं। जबकि OleDb के लिए OleDbConnectionStringBuilder Class को Use कर सकते हैं।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF