在默认情况下,SqlDataSource返回的是数据集(DataSet),你也可以使它返回一个DataReader ,方法是把它的DataSourceMode属性设置为“DataReader”。当希望把DataReader的检索结果转换为现成的代码(existing code )时,设置为DataReader往往是首选。另外DataReader比起DataSet来简单的多,功能更强大。不过将DataSourceMode属性设置为“DataReader”后,数据Web控件便不能启用分页或排序功能,因为SqlDataSource无法得知总共返回了多少条记录,并且DataReader也不支持对返回的数据排序。
第四步:使用自定义的SQL查询或存储过程
前面讲到,SqlDataSource控件从数据库检索数据的方法有2种。在第二步我们探讨了从表Products返回数据的方法,现在我们探讨用自定义SQL查询的情况。
在Querying.aspx添加一个新的GridView控件,在其智能标签的下拉列表中选择“新建数据源”,在“选择数据源类型”界面中选“database”,将数据源ID设置为“ProductsWithCategoryInfoDataSource”。
图12:创建一个新的SqlDataSource控件,并命名为ProductsWithCategoryInfoDataSource
下一步,接着会询问使用哪个数据连接,就想我们在图7做的那样,在下拉列表中选择NORTHWINDConnectionString,点下一步,在配置SQL语句界面中,选择“指定自定义SQL语句或存储过程”,点下一步,进入“定义自定义语句或存储过程”界面,包含“选择”,“更新”,“删除”,“插入”四个选项卡,在每个选项卡中,你可以在文本框中输入自定义SQL语句,或者在下拉列表中选择存储过程。本章我们讨论输入自定义SQL语句,在下面的教程中再探讨使用存储过程的情况。
图13:输入自定义SQL语句或选择某个存储过程
可以手工输入自定义SQL语句,也可以借助于查询生成器来辅助生成。不管用哪种,都应使用如下查询:
SELECT Products.ProductID, Products.ProductName, Categories.CategoryName FROM Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID
图14:使用查询生成器图像化的构造查询
点下一步进入“测试查询”界面,点“完成”结束设置。完成设置后,GridView的代码应该看起来象下面这样:
<asp:GridView runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ProductsWithCategoryInfoDataSource" EnableViewState="False"> <Columns> <asp:BoundField DataField="ProductID" HeaderText="ProductID" InsertVisible="False" ReadOnly="True" SortExpression="ProductID" /> <asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" /> <asp:BoundField DataField="CategoryName" HeaderText="CategoryName" SortExpression="CategoryName" /> </Columns> </asp:GridView> <asp:SqlDataSource runat="server" ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>" SelectCommand=" SELECT Products.ProductID, Products.ProductName, Categories.CategoryName FROM Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID"> </asp:SqlDataSource>
图15:GridView显示了每个产品的ID, Name和Category Name
总结:
在本章我们探讨了怎样用SqlDataSource控件查询和显示数据。和ObjectDataSource控件一样,它们都是作为一种访问数据库的代理。我们可以在属性窗口中或通过设置它的数据源向导,来指定它要连接的数据库以及要执行的SQL选择查询(SQL SELECT query)