学习SqlDataSource数据源控件(二)

如何使用SqlDataSource数据源控件来选择记录
一、SqlDataSource数据源控件如何执行存储过程
首先创建两个存储过程:
第一个存储过程返回产品所属的子类别
CREATE   PROCEDURE   [ dbo ] . [ GetProductSubCategories ]
AS
  
SELECT  ProductSubcategoryID, Name  FROM  Production.ProductSubcategory
  
ORDER   BY  ProductSubcategoryID
第二个存储过程接收具体的子类别ID,返回属于该子类别ID的所有产品
CREATE   PROCEDURE   [ dbo ] . [ GetProductsByCategoryID ]
@ProductSubcategoryID   int
AS
  
SELECT  ProductID, Name, ProductNumber  FROM  Production.Product
  
WHERE  ProductSubcategoryID = @ProductSubcategoryID   ORDER   BY  ProductID
具体代码如下:
StoredProcedure代码
 1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SqlDataSourceDataBindingStoredProcedureChapter4.aspx.cs" Inherits="SqlDataSourceDataBindingStoredProcedureChapter4" %>
 2
 3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4
 5<html xmlns="http://www.w3.org/1999/xhtml" >
 6<head runat="server">
 7    <title>Executing a Stored Procedure using SqlDataSource Control</title>
 8</head>
 9<body>
10    <form id="form1" runat="server">
11    <div>
12        <asp:SqlDataSource ID="categoriesSource" runat="server" ProviderName="System.Data.SqlClient"
13        ConnectionString="<%$ ConnectionStrings:AdventureWorks %>" 
14        SelectCommand="GetProductSubCategories" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
15        Categories:
16        <asp:DropDownList ID="lstCategories" DataSourceID="categoriesSource" runat="server"
17        DataValueField="ProductSubcategoryID" DataTextField="Name" AutoPostBack="true"></asp:DropDownList>
18        
19        <asp:SqlDataSource ID="productsSource" runat="server" ProviderName="System.Data.SqlClient"
20        ConnectionString="<%$ ConnectionStrings:AdventureWorks %>"
21        SelectCommand="GetProductsByCategoryID" SelectCommandType="StoredProcedure">
22        <SelectParameters>
23            <asp:ControlParameter ControlID="lstCategories" Name="ProductSubcategoryID" PropertyName="SelectedValue"/>
24        </SelectParameters>
25        </asp:SqlDataSource>
26        <asp:GridView DataSourceID="productsSource" runat="server"
27        HeaderStyle-HorizontalAlign="Center" HeaderStyle-Font-Bold="true"
28        HeaderStyle-Backcolor="blue" HeaderStyle-ForeColor="white"></asp:GridView>
29    </div>
30    </form>
31</body>
32</html>
注意其中使用了SqlDataSource中的SelectCommandType属性。该属性默认设置为"Text",这里设置为"StoredProcedure",这样就能调用存储过程来完成查询。
二、使用DataReader来读取数据
SqlDataSource控件要么返回DataSet,要么返回DataReader。默认为DataSet,以前的例子就是使用DataSet。DataSet可以使GridView控件内置的排序和分页功能得到体现,也可以利用SqlDataSource的缓存功能。但是DataReader在当只需要向前访问数据时,它要比使用DataSet具有更高的性能,然而这种情况就无法使用排序功能了。
如何设置呢?需要在SqlDataSource控件的DataSourceMode属性中设置。
请看如下代码:
DataReader代码
 1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SqlDataSourceDataBindingDataReaderChapter4.aspx.cs" Inherits="SqlDataSourceDataBindingDataReaderChapter4" %>
 2
 3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4
 5<html xmlns="http://www.w3.org/1999/xhtml" >
 6<head runat="server">
 7    <title>无标题页</title>
 8</head>
 9<body>
10    <form id="form1" runat="server">
11    <div>
12        <asp:SqlDataSource ID="categoriesSource" runat="server" ProviderName="System.Data.SqlClient" 
13        DataSourceMode="DataReader" ConnectionString="<%$ ConnectionStrings:AdventureWorks %>" 
14        SelectCommand="SELECT ProductSubcategoryID, Name FROM Production.ProductSubcategory"></asp:SqlDataSource>
15        Categories:
16        <asp:DropDownList ID="lstCategories" DataSourceID="categoriesSource" runat="server"
17        DataValueField="ProductSubcategoryID" DataTextField="Name" AutoPostBack="true"></asp:DropDownList>
18        
19        <asp:SqlDataSource ID="productsSource" runat="server" ProviderName="System.Data.SqlClient"
20        DataSourceMode="DataReader" ConnectionString="<%$ ConnectionStrings:AdventureWorks %>"
21        SelectCommand="SELECT ProductID, Name, ProductNumber, StandardCost FROM Production.Product WHERE ProductSubcategoryID=@ProductSubcategoryID">
22        <SelectParameters>
23            <asp:ControlParameter ControlID="lstCategories" Name="ProductSubcategoryID" PropertyName="SelectedValue"/>
24        </SelectParameters>
25        </asp:SqlDataSource>
26        <asp:GridView ID="GridView1" DataSourceID="productsSource" runat="server"
27        HeaderStyle-HorizontalAlign="Center" HeaderStyle-Font-Bold="true"
28        HeaderStyle-Backcolor="blue" HeaderStyle-ForeColor="white"></asp:GridView> 
29    </div>
30    </form>
31</body>
32</html>
注意:DataSourceMode属性设置为DataReader。
三、从QueryString中获取数据
具体代码如下:
QueryString代码
 1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SqlDataSourceDataBindingQueryStringChapter4.aspx.cs" Inherits="SqlDataSourceDataBindingQueryStringChapter4" %>
 2
 3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4
 5<html xmlns="http://www.w3.org/1999/xhtml" >
 6<head runat="server">
 7    <title>无标题页</title>
 8</head>
 9<body>
10    <form id="form1" runat="server">
11    <div>
12        <asp:SqlDataSource ID="productsSource" runat="server" ProviderName="System.Data.SqlClient"
13        ConnectionString="<%$ ConnectionStrings:AdventureWorks %>"
14        SelectCommand="GetProductsByCategoryID" SelectCommandType="StoredProcedure">
15        <SelectParameters>
16            <asp:QueryStringParameter Name="ProductSubcategoryID" QueryStringField="CategoryID"/>
17        </SelectParameters>
18        </asp:SqlDataSource>
19        <asp:GridView ID="GridView1" DataSourceID="productsSource" runat="server"
20        HeaderStyle-HorizontalAlign="Center" HeaderStyle-Font-Bold="true"
21        HeaderStyle-Backcolor="blue" HeaderStyle-ForeColor="white"></asp:GridView>
22    </div>
23    </form>
24</body>
25</html>
上面的代码将QueryString值作为参数传递给存储过程。
<asp:QueryStringParameter>控件中的Name和QueryStringField属性,分别设置存储过程参数和查询字符串名称。
如何触发呢?要在该页面运行后,浏览器地址栏中自行手动添加查询字符串"?CategoryID=N",N在这里是数字,1,2,3,4...
这个QueryStringParameter参数控件仍旧是SelectParameters集合中包含的一种参数控件。
四、利用SqlDataSource控件处理返回参数值
首先创建存储过程
1 CREATE   PROCEDURE   [ dbo ] . [ GetDepartments ]
2    AS
3    SELECT  DepartmentID, Name, GroupName, ModifiedDate  FROM  HumanResources.Department
4    DECLARE   @Count   smallint
5    SELECT   @Count   =   Count (DepartmentID)  FROM  HumanResources.Department
6    RETURN   @Count
具体代码如下:
Return Parameters代码
 1<%@ Page Language="C#" AutoEventWireup="true"%>
 2<%@ Import Namespace="System.Text" %>
 3<%@ Import Namespace="System.Data.SqlClient" %>
 4
 5<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 6
 7<script runat="server">
 8
 9    protected void deptSource_Selected(object sender, SqlDataSourceStatusEventArgs e)
10    {
11        StringBuilder builder = new StringBuilder();
12        foreach( SqlParameter param in e.Command.Parameters)
13        {
14            builder.Append(Server.HtmlDecode(param.ParameterName) + "=");
15            builder.Append(Server.HtmlDecode(param.Value.ToString()) + "(");
16            builder.Append(Server.HtmlDecode(param.Value.GetType().ToString()) + ")<br>");
17        }

18        lblResult.Text = "Return Parameter :" + builder.ToString();
19    }

20
</script>
21
22<html xmlns="http://www.w3.org/1999/xhtml" >
23<head runat="server">
24    <title>Handling Return Parameters from a Stored Procedure</title>
25</head>
26<body>
27    <form id="form1" runat="server">
28    <div>
29        <asp:GridView ID="deptView" runat="server" AllowPaging="True" AllowSorting="True"
30        DataSourceID="deptSource" DataKeyNames="DepartmentID" AutoGenerateColumns="False"
31        HeaderStyle-HorizontalAlign="Center" HeaderStyle-Font-Bold="true" HeaderStyle-BackColor="blue" HeaderStyle-ForeColor="white">
32        <Columns>
33            <asp:BoundField ReadOnly="True" HeaderText="Department ID" DataField="DepartmentID" SortExpression="DepartmentID"/>
34            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
35            <asp:BoundField DataField="GroupName" HeaderText="Group Name" SortExpression="GroupName" />
36            <asp:BoundField DataField="ModifiedDate" HeaderText="ModifiedDate" SortExpression="ModifiedDate" />
37        </Columns>            
38        </asp:GridView>
39        <asp:SqlDataSource ID="deptSource" runat="server" ProviderName="System.Data.SqlClient"
40        ConnectionString="<%$ ConnectionStrings:AdventureWorks %>"
41        SelectCommand="GetDepartments" SelectCommandType="StoredProcedure" OnSelected="deptSource_Selected">
42        <SelectParameters>
43            <asp:Parameter Direction="ReturnValue" Name="ReturnValue" Type="Int32" />
44        </SelectParameters>
45        </asp:SqlDataSource>
46        <asp:Label runat="server" Font-Bold="true" ID="lblResult"></asp:Label>
47    </div>
48    </form>
49</body>
50</html>
SelectParameter集合除了以前谈到的输入参数外,还可以实现双向的参数。通过Parameter类的Direction属性来设置,该属性值如下:Input、Output、InputOutput和ReturnValue。
为了在数据操作完成之后获取这些参数值,利用适当的发送操作事件,例如这里的Selected(还可以是Updated、Inserted、Deleted),从传递给这些事件的事件参数中获取参数值。上面的例子中通过SqlDataSourceStatusEventArgs的Command属性来获取参数值。
注意:<asp:Parameter>中的Direction属性设置为"ReturnValue",Name属性的值相当于给通过查询返回的参数重新命名,这里将返回参数@Count设置为@ReturnValue。



转载于:https://www.cnblogs.com/netdemon/archive/2007/10/21/931949.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值