<asp:SqlDataSource runat="server" ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>" SelectCommand="SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]"> </asp:SqlDataSource>
其中ConnectionString属性提供了怎样连接数据库的详细信息,可以用完整的,硬编码的连接字符串对其赋值,也可以用Web.config文件中的连接字符串来赋值。当用Web.config文件中的字符串时,语法为:<%$ expressionPrefix:expressionValue %>,特别地expressionPrefix就是“ConnectionStrings”,而expressionValue 则是Web.config文件<connectionStrings>部分中,连接字符串的名字。关于此语法的更多信息请参考: ASP.NET Expressions Overview
而SelectCommand属性是SQL查询语句或存储过程的详细陈述。
第三步:添加数据Web控件并绑定到SqlDataSource
一旦设置好SqlDataSource后,就可以用GridView 或DetailsView等数据Web控件绑定它。在本篇教程中我们使用GridView,从工具箱拖一个GridView控件到页面上,在智能标签中的“选择数据源”里选ProductsDataSource ,这样就将GridView控件绑定到我们前面设置的SqlDataSource控件了。
图10:添加GridView控件并绑定到SqlDataSource
完成绑定后,Visual Studio 会自动为GridView从数据源控件返回的每一列添加一个BoundField 或CheckBoxField 。就本文来说既然SqlDataSource从数据库返回三列:ProductID, ProductName, 和 UnitPrice ,那么Visual Studio就在自动在GridView中生成三列(three fields )。
花几分钟来设置GridView的三个BoundFields:把ProductName field的HeaderText 属性设置为“Product Name”,UnitPrice field设置为“Price”,同时格式化为货币形式。修改后,你的GridView代码看起来应该象下面这样:
<asp:GridView runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ProductsDataSource" EnableViewState="False"> <Columns> <asp:BoundField DataField="ProductID" HeaderText="ProductID" InsertVisible="False" ReadOnly="True" SortExpression="ProductID" /> <asp:BoundField DataField="ProductName" HeaderText="Product Name" SortExpression="ProductName" /> <asp:BoundField DataField="UnitPrice" HeaderText="Price" SortExpression="UnitPrice" DataFormatString="{0:c}" HtmlEncode="False" /> </Columns> </asp:GridView>
在浏览器中浏览本页,如图11所示,GridView列出了每个产品的ProductID, ProductName, 和UnitPrice。
图11:GridView里列出了每个产品的ProductID, ProductName, 和UnitPrice。
测试该页面时,GridView调用其数据源控件的Select()方法。如果我们使用ObjectDataSource控件来测试该页面的话,它将会调用逻辑层ProductsBLL class的GetProducts() 方法。而用SqlDataSource控件的话,其Select()方法将直接链接到要访问的数据库,并传递SelectCommand(具体就本例而言,传递的是SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products])。SqlDataSource将返回的结果传递给GridView,后者根据从数据库返回的每一条记录生产一行(a row)
SqlDataSource控件及数据Web控件的内置属性
一般来说,数据Web控件的分页,排序,编辑,插入,删除等属性是由数据Web控件自身指定的,跟它所使用的数据源控件没有太大关系。也就是说,GridView可以自由的启用它内建的分页,排序,编辑和删除功能,而不管它到底是绑定到SqlDataSource控件还是ObjectDataSource控件。然而,数据Web控件的某些属性却要受其绑定的数据源控件及其设置的影响。
比如, 就像我们在Efficiently Paging Through Large Amounts of Data 这章教程中探讨的那样,在启用分页功能后,在默认情况下,每次跳转页面时,数据Web控件都会对所有的记录重新检索,尽管我们只需要显示特定的那几条记录。这种模式在要检索的数据量很大的情况下,效率会很低。不过ObjectDataSource控件可以通过自定义分页的方法仅仅返回那些需要在当前页面上显示的记录,很遗憾的是SqlDataSource控件不支持自定义分页功能。
在默认情况下,SqlDataSource控件返回的数据可以通过GridView控件来进行分页和排序。来做个示范,在Querying.aspx 页面中,在GridView控件的智能标签里启用分页和排序功能,看它是否象我们期望的那样工作。
分页和排序的原理在于SqlDataSource控件将检索的数据库数据转换成“泛型数据集”(loosely-typed DataSet)。那些被用来分页的每条记录就蕴含
在数据集里面,此外,数据集支持对返回的结果进行排序。当GridView请求对数据分页或排序时,SqlDataSource控件自动完成上述工作。