Parameterized Command in ASP.NET – पिछले Example में हमने SqlDataSource Control के माध्यम से एक Drop-Down List Control में सभी Product Names की List को Retrieve करके Output में Render करने के लिए निम्नानुसार तरीके से Example Code Create किया था, जो कि पूरी तरह से Automatically Generate हुआ था:
File Name: DataSourceControls.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DataSourceControls.aspx.cs" Inherits="DataSourceControls" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>" SelectCommand="SELECT * FROM [Alphabetical list of products]" SelectCommandType="Text" ></asp:SqlDataSource> <br /> <asp:DropDownList ID="ddlProducts" runat="server" AutoPostBack="True" DataSourceID="SqlDataSource1" DataTextField="ProductName" DataValueField="ProductID" ></asp:DropDownList> </div> </form> </body> </html>
हम समझ सकते हैं कि ये एक काफी सरल Example था, जो कि कोई भी उपयोगी काम पूरा नहीं कर रहा है। जबकि मानलो कि हम इस DropDownList Control में जिस किसी भी Product को Select करें, उस Product की Full Details हमें Output में दिखाई दे।
सामान्यत: इस जरूरत को पूरा करने के लिए हम दो SqlDataSource Control Create कर सकते हैं, जहां पहला SqlDataSource Control उपरोक्तानुसार तरीके से DropDownList Control में सभी Products का Name Fill करता है, जबकि इस DropDownList Control में जिस Item को Select किया जाता है, उस Item के ID को Use करते हुए दूसरे SqlDataSource Control द्वारा Underlying Database से केवल उसी Product की Details को Retrieve करके किसी अन्य Control में Fill किया जाता है या किसी अन्य Control के माध्यम से उसे Render किया जाता है। इस दूसरे SqlDataSource Control को हम निम्नानुसार तरीके से Specify कर सकते हैं:
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued FROM Products WHERE (ProductID = @ProductID)" ></asp:SqlDataSource>
लेकिन इस DataSource Control की एक समस्या है। इस DataSource Control में हमने @ProductID नाम का एक Parameter Specify किया है, जो कि उस Product के ID को Identify करता है, जिसकी Detailed Information को हम Retrieve करना चाहते हैं।
इस प्रकार के Data Source Control को Underlying Database के Record से Fill करने के लिए हमें Parameter के रूप में उस Product का ID @ProductID में के रूप में Pass करना होता है, जिसे पहले SqlDataSource में Select किया गया होता है। इस Parameter को हम निम्नानुसार Specify कर सकते हैं:
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued FROM Products WHERE (ProductID = @ProductID)" > <SelectParameters> <asp:ControlParameter ControlID="ddlProducts" Name="ProductID" PropertyName="SelectedValue" /> </SelectParameters> </asp:SqlDataSource>
जब इस Code में Specified तरीके से हम <asp:ControlParameter> Element को Specify करते हैं, तो हमें ये बताना होता है कि किस Control की किस Property का मान किस Parameter को Set होगा।
हमारे उपरोक्त Code में हम चाहते हैं कि ddlProducts (ControlID=”ddlProducts”) नाम के Control में जिस Item को Select किया जाए] उस Selected Control की Value Property (PropertyName=”SelectedValue”) में Specified Product का ID SQL Query के @ProductID (Name=”ProductID”) Parameter में Set हो जाए।
यहां ध्यान रखने वाली बात ये है कि जब हम SelectCommand (SelectQuery) Use करते हैं, तब Parameter के रूप में हमें उपरोक्तानुसार तरीके से <SelectParameters> Element को Use करना होता है।
जबकि InsertCommand (InsertQuery) Use करते समय हमें Parameter के रूप में <InsertParameters> Element को] UpdateCommand (UpdateQuery) Use करते समय <UpdateParameters> Element को तथा DeleteCommand (DeleteQuery) Use करते समय Parameter के रूप में <DeleteParameters> Element को Use करना होता है।
Parameter को Specify करते समय हमें हमेंशा @ Symbol को Use करना होता है और हम हमारी जरूरत के अनुसार जितने चाहें उतने Parameters Specify कर सकते हैं, लेकिन हमें प्रत्येक Parameter को उसकी Value के साथ SelectParameters Collection में Match करना जरूरी होता है, जैसाकि उपरोक्त Example में ProductID Field को @ProductID Parameter के साथ Match किया है।
हमारे इस उदाहरण में @ProductID का मान ddlProducts.SelectedValue Property से आ रहा है। अन्य शब्दों में कहें तो हम हमारे DataSource को एक ऐसी Value के साथ Bind कर रहे हैं, जो कि Currently एक अन्य Control ddlProducts में है, जिसे Click करने पर उस List से Generate होने वाले ProductID, के आधार पर Underlying Database से नया Record Retrieve होता है।
इतना ही नहीं, यदि हम ddlProducts Control में Currently Select किए गए ProductName को Access करना चाहें, तो ये नाम हमें SelectedText Property द्वारा प्राप्त हो सकता है। जिससे हम ये जान सकते हैं कि User ने DropDownList Control में किस Product Name को Select किया है।
जब एक बार हम एक और SqlDataSource Control Create करके, उसमें Selected Product की Detailed Information प्राप्त कर लेते हैं, उसके बाद हम इस Control में Stored Data को किसी भी Control के साथ Associated करके उसमें Fill कर सकते हैं और जरूरत के अनुसार Render कर सकते हैं।
हालांकि हम किसी भी Control के साथ केवल एक ही File के Data को Render कर सकते हैं, लेकिन जब हम Rich Data Controls जैसे कि GridView, DetailsView या FormView Use करते हैं, तब हम SqlDataSource Control के सभी Records व प्रत्येक Record के प्रत्येक Field को एक ही बार में एक ही Control द्वारा Render कर सकते हैं। जैसे:
उपरोक्त चित्र के अनुसार ASP.NET Page पर DetailsView Control को Place करके उसके Data Source Property को SqlDataSource2 से Set करने के बाद जब हम हमारे इस Webpage को Run करते हैं, तो हमें निम्नानुसार Output प्राप्त होता है:
जबकि इस DetailsView Control को Add करने पर Automatically Generate होने वाला Markup निम्नानुसार होता है, जिसमें हमें केवल DataSourceID Attribute को ही उस SqlDataSource Control के ID से Set करना होता है, जिसके Data को हम DetailsView Control द्वारा Output में Render करना चाहते हैं:
<asp:DetailsView ID="dvProducts" runat="server" DataSourceID="SqlDataSource2" ></asp:DetailsView>
इसलिए जब हम इस बार अपने Example को Run करते हैं, तो जैसे ही हम हमारे DropDownList Control में किसी Product Name को Select करते हैं, उससे Associated Product की Details हमें DetailsView Control में उपरोक्त चित्रानुसार दिखाई देने लगती है।
यानी हमारे उपरोक्त Example में हमें DropDownList Control के SelectedIndexChanged Event को Handle करने की भी जरूरत नहीं होती बल्कि ये काम ASP.NET द्वारा Internally कर लिया जाता है और हमारा Resultant ASP.NET Page में केवल निम्नानुसार Codes होते हैं:
File Name: DataSourceControls.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DataSourceControls.aspx.cs" Inherits="DataSourceControls" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>" SelectCommand="SELECT * FROM [Alphabetical list of products]" SelectCommandType="Text" ></asp:SqlDataSource> <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued FROM Products WHERE (ProductID = @ProductID)" > <SelectParameters> <asp:ControlParameter ControlID="ddlProducts" Name="ProductID" PropertyName="SelectedValue" /> </SelectParameters> </asp:SqlDataSource> <asp:DropDownList ID="ddlProducts" runat="server" AutoPostBack="True" DataSourceID="SqlDataSource1" DataTextField="ProductName" DataValueField="ProductID" ></asp:DropDownList> <asp:DetailsView ID="dvProducts" runat="server" DataSourceID="SqlDataSource2" ></asp:DetailsView> </div> </form> </body> </html>
जहां Code-Behind File में हमने एक भी Line का Code नहीं लिखा है, जबकि इसी Example को हमने पहले भी कई तरीकों से Create किया है और हर बार हमें Code-Behind File में किसी न किसी प्रकार के Code को लिखना ही पडा है।
ASP.NET WebForms की यही सबसे बडी विशेषता है, जिसकी वजह से बिना एक भी Line का Program-Logic लिखे हुए भी काफी तेज गति से Web Applications Develop किए जा सकते हैं, जिसके लिए HTML, CSS, JavaScript जैसी Code Web Languages का ज्ञान होना भी जरूरी नहीं होता। हालांकि यदि इन Core Languages का ज्ञान हो, तो हम हमारे ASP.NET WebForms Application को काफी बेहतर तरीके से Control कर सकते हैं।
Buy this eBook to learn more about …
- Other Types of Parameterized Commands
- Parameterized Stored Procedures
- Setting Parameter with Unknown Value
- Error Handling
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook Advance ASP.NET WebForms with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
Advance ASP.NET WebForms in Hindi | Page:707 | Format: PDF