46使用SqlDataSource控件检索数据.docx
- 文档编号:12063408
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:20
- 大小:699.80KB
46使用SqlDataSource控件检索数据.docx
《46使用SqlDataSource控件检索数据.docx》由会员分享,可在线阅读,更多相关《46使用SqlDataSource控件检索数据.docx(20页珍藏版)》请在冰豆网上搜索。
46使用SqlDataSource控件检索数据
在ASP.NET2.0中操作数据之四十六:
使用SqlDataSource控件检索数据
导言
到目前为止,我们探讨的教程是由表现层,业务逻辑层和数据访问层构成的层次体系结构。
数据访问层和业务逻辑层分别在教程第一和第二章提到。
在DisplayingDataWiththeObjectDataSource这篇教程里,我们探讨了怎样用ASP.NET2.0的新控件--ObjectDataSource控件在表现层展示数据。
本教程到目前为止用这种层次结构来处理数据。
然而绕过这种体系结构,通过直接把数据查询和业务逻辑放在Web页面上,也可以达到直接在ASP.NET页面上访问,插入,更新,删除数据库数据的目的。
对十分庞大或者复杂的应用程序而言,使用层次结构对程序的成功和可维护性是很重要的。
然而对很简单的程序来说,没有必要使用层次体系结构。
ASP.NET2.0提供了5个内建的数据源控件,SqlDataSource控件,AccessDataSource控件,ObjectDataSource控件,XmlDataSource控件,和SiteMapDataSource控件。
SqlDataSource控件能直接从关系型数据库中访问和更新数据,包括MicrosoftSQLServer,MicrosoftAccess,Oracle,MySQL等数据库。
在本章以及接下来的3章教程里面,我们将探讨如何用SqlDataSource控件来查询和筛选数据库数据,包括插入,更新和删除。
图1:
ASP.NET2.0的5个内建的数据源控件
比较ObjectDataSource控件和SqlDataSource控件
从理论上说,ObjectDataSource控件和SqlDataSource控件都是作为访问数据的一种代理。
就象在教程DisplayingDataWiththeObjectDataSource中讨论的那样,可以在ObjectDataSource控件中设置展示数据的数据类型,以及用来选择,插入,更新和删除数据所调用的方法。
一旦完成了ObjectDataSource控件的设置,GridView,DetailsView,DataList等数据Web控件便可以通过绑定ObjectDataSource控件调用其Select(),Insert(),Delete(),和Update()methods方法。
虽然SqlDataSource控件具有和SqlDataSource控件同样的功能,但使用SqlDataSource控件时,我们必须提供详细的数据库连接字符串,以及用来执行选择,更新,插入,删除数据的ad-hocSQL查询或存储过程。
当调用SqlDataSource控件的Select(),Insert(),Update(),andDelete()方法时,SqlDataSource控件连接到数据库,并传递适当的SQL查询。
下图展示了这些方法如何连接数据库,传递查询和返回结果。
图2 SqlDataSource控件充当访问数据库的代理
注意:
在本章教程中我们主要关注如何从数据库获得数据,在后面的教程中,我们将讨论如何通过设置SqlDataSource控件以支持插入,更新和删除数据。
SqlDataSource控件和AccessDataSource控件
除了SqlDataSource控件外,ASP.NET2.0还包AccessDataSource控件。
这两种不同的控件使很多开发者误以为AccessDataSource控件主要是被设计来与MicrosoftAccess数据库打交道,SqlDataSource控件主要是被设计来来与MicrosoftSQLServer打交道。
实际情况是,SqlDataSource控件可以与几乎所有.NET能访问的关系型数据库打交道。
包括任何OleDb,ODBC,compliantdatastores,比如:
MicrosoftSQLServer,MicrosoftAccess,Oracle,Informix,MySQL,andPostgreSQL等。
SqlDataSource控件和AccessDataSource控件的唯一区别在于AccessDataSource控件的数据库连接信息只需要提供Access数据库文件的访问路径。
而SqlDataSource控件则需要提供完整的连接字符串。
第一步:
创建SqlDataSource页面
在我们探讨用SqlDataSource控件直接操作数据库数据之前,让我们先花些时间在我们的站点项目里添加这些本节里和下三节里需要的ASP.NET页面。
首先添加一个名为SqlDataSource的文件夹,在里面添加下列页面,并配置为使用Site.master母板页。
Default.aspx
Querying.aspx
ParameterizedQueries.aspx
InsertUpdateDelete.aspx
OptimisticConcurrency.aspx
图3:
为SqlDataSource相关教程添加页面
类似在其它文件夹里,EditInsertDelete文件夹里的Default.aspx将列出这些教程章节。
记得用户控件提供这个功能。
因此,从解决方案资源管理器中拖拽一个这个用户控件到页面的设计视图,从而添加它到Default.aspx页面
图4:
将用户控件添加到Default.aspx页面
最后把这4个页面加入站点地图中。
打开Web.sitemap文件并且把下列代码加在“AddingCustomButtonstotheDataListandRepeater”siteMapNode标记之后:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
title="UsingtheSqlDataSourceControl" description="WorkdirectlywithdatabasedatausingtheSqlDataSourcecontrol."> description="Examineshowtoquerydatafromadatabasethatcanthenbe displayedthroughadataWebcontrol."/> title="ParameterizedQueries" description="LearnhowtospecifyparameterizedWHEREclausesinthe SqlDataSource'sSELECTstatement."/> title="Inserting,Updating,andDeletingDatabaseData" description="SeehowtoconfiguretheSqlDataSourcetoincludeINSERT,UPDATE, andDELETEstatements."/> title="UsingOptimisticConcurrency" description="ExplorehowtoaugmenttheSqlDataSourcetoincludesupportfor optimisticconcurrency."/> 图5: 更新站点地图使之包含新的页面 第二步: 添加并设置SqlDataSource控件 在SqlDataSource文件夹中打开Querying.aspx页面,切换到设计试图。 从工具箱中拖一个SqlDataSource控件到设计器中,设置其ID为ProductsDataSource。 和ObjectDataSource一样,SqlDataSource不产生任何的声明标记,所以现在在页面上看起来就象一个灰色的方块。 点击SqlDataSource控件的智能标签,点“ConfigureDataSource”链接,进入数据源配置向导。 图6: 在智能标签里点击“设置数据源”链接。 ObjectDataSource控件和SqlDataSource控件的配置向导有些许不同,但最终目的都是相同的: 详细的说明了如何从数据库获取,插入,更新和删除数据。 ObjectDataSource控件明确指定了要访问的数据库,并提供了要使用的SQL查询声明或存储过程的详细情况 向导的第一步是选择要访问的数据库,在下拉列表中包含了放在App_Data文件夹中的数据库,以及添加到服务器资源管理器的数据连接节点中的数据库。 一旦我们将一个连接到App_Data文件夹中的NORTHWIND.MDF数据库的连接字符串添加到项目的Web.config文件中,这个连接字符串就会出现在下拉列表的选项。 如下图,选中它,点“下一步”。 图7: 从下拉列表里选择NORTHWINDConnectionString 选择数据库后,向导转入“如何从数据库检索数据”界面。 有2种方式: 第一种指定自定义SQL语句或存储过程,第二种是指定来自表或视图的列。 注意: 我们先探讨使用“指定来自表或视图的列”选项的实例,稍后再探讨用“自定义SQL语句或存储过程”选项的实例。 图8是我们点击“指定来自表或视图的列”单选按钮时的画面,这里我们选择Products表,返回ProductID,ProductName和UnitPrice列。 完成选择后,在底部的方框内将显示SQL语句: SELECT[ProductID],[ProductName],[UnitPrice]FROM[Products] 图8: 从表Products返回数据。 完成上述设置后,点“下一步”按钮,进入测试查询界面,在这里可以测试上一步所设置的查询的结果。 点击“测试查询”按钮,执行查询。 图9: 点击“测试”,从SELECT查询检索数据。 最后,点“完成”按钮完成向导。 和ObjectDataSource一样,SqlDataSource的向导设置只是完成了对SqlDataSource控件属性的赋值而已,即ConnectionString属性和SelectCommand属性。 完成设置之后,我们的SqlDataSource控件代码应该和下面的差不多: 1 2 3 4 SqlDataSourceID="ProductsDataSource"runat="server" ConnectionString="<%$ConnectionStrings: NORTHWNDConnectionString%>" SelectCommand="SELECT[ProductID],[ProductName],[UnitPrice]FROM[Products]"> SqlDataSource> 其中ConnectionString属性提供了怎样连接数据库的详细信息,可以用完整的,硬编码的连接字符串对其赋值,也可以用Web.config文件中的连接字符串来赋值。 当用Web.config文件中的字符串时,语法为: <%$expressionPrefix: expressionValue%>,特别地expressionPrefix就是“ConnectionStrings”,而expressionValue则是Web.config文件 关于此语法的更多信息请参考: ASP.NETExpressionsOverview 而SelectCommand属性是SQL查询语句或存储过程的详细陈述。 第三步: 添加数据Web控件并绑定到SqlDataSource 一旦设置好SqlDataSource后,就可以用GridView或DetailsView等数据Web控件绑定它。 在本篇教程中我们使用GridView,从工具箱拖一个GridView控件到页面上,在智能标签中的“选择数据源”里选ProductsDataSource,这样就将GridView控件绑定到我们前面设置的SqlDataSource控件了。 图10: 添加GridView控件并绑定到SqlDataSource 完成绑定后,VisualStudio会自动为GridView从数据源控件返回的每一列添加一个BoundField或CheckBoxField。 就本文来说既然SqlDataSource从数据库返回三列: ProductID,ProductName,和UnitPrice,那么VisualStudio就在自动在GridView中生成三列(threefields)。 花几分钟来设置GridView的三个BoundFields: 把ProductNamefield的HeaderText属性设置为“ProductName”,UnitPricefield设置为“Price”,同时格式化为货币形式。 修改后,你的GridView代码看起来应该象下面这样: 1 2 3 4 5 6 7 8 9 10 11 12 13 GridViewID="GridView1"runat="server"AutoGenerateColumns="False" DataKeyNames="ProductID"DataSourceID="ProductsDataSource" EnableViewState="False"> BoundFieldDataField="ProductID"HeaderText="ProductID" InsertVisible="False"ReadOnly="True"SortExpression="ProductID"/> BoundFieldDataField="ProductName"HeaderText="ProductName" SortExpression="ProductName"/> BoundFieldDataField="UnitPrice"HeaderText="Price" SortExpression="UnitPrice"DataFormatString="{0: c}" HtmlEncode="False"/> GridView> 在浏览器中浏览本页,如图11所示,GridView列出了每个产品的ProductID,ProductName,和UnitPrice。 图11: GridView里列出了每个产品的ProductID,ProductName,和UnitPrice。 测试该页面时,GridView调用其数据源控件的Select()方法。 如果我们使用ObjectDataSource控件来测试该页面的话,它将会调用逻辑层ProductsBLLclass的GetProducts()方法。 而用SqlDataSource控件的话,其Select()方法将直接链接到要访问的数据库,并传递SelectCommand(具体就本例而言,传递的是SELECT[ProductID],[ProductName],[UnitPrice]FROM[Products])。 SqlDataSource将返回的结果传递给GridView,后者根据从数据库返回的每一条记录生产一行(arow) SqlDataSource控件及数据Web控件的内置属性 一般来说,数据Web控件的分页,排序,编辑,插入,删除等属性是由数据Web控件自身指定的,跟它所使用的数据源控件没有太大关系。 也就是说,GridView可以自由的启用它内建的分页,排序,编辑和删除功能,而不管它到底是绑定到SqlDataSource控件还是ObjectDataSource控件。 然而,数据Web控件的某些属性却要受其绑定的数据源控件及其设置的影响。 比如,就像我们在EfficientlyPagingThroughLargeAmountsofData这章教程中探讨的那样,在启用分页功能后,在默认情况下,每次跳转页面时,数据Web控件都会对所有的记录重新检索,尽管我们只需要显示特定的那几条记录。 这种模式在要检索的数据量很大的情况下,效率会很低。 不过ObjectDataSource控件可以通过自定义分页的方法仅仅返回那些需要在当前页面上显示的记录,很遗憾的是SqlDataSource控件不支持自定义分页功能。 在默认情况下,SqlDataSource控件返回的数据可以通过GridView控件来进行分页和排序。 来做个示范,在Querying.aspx页面中,在GridView控件的智能标签里启用分页和排序功能,看它是否象我们期望的那样工作。 分页和排序的原理在于SqlDataSource控件将检索的数据库数据转换成“泛型数据集”(loosely-typedDataSet)。 那些被用来分页的每条记录就蕴含 在数据集里面,此外,数据集支持对返回的结果进行排序。 当GridView请求对数据分页或排序时,SqlDataSource控件自动完成上述工作。 在默认情况下,SqlDataSource返回的是数据集(DataSet),你也可以使它返回一个DataReader,方法是把它的DataSourceMode属性设置为“DataReader”。 当希望把DataReader的检索结果转换为现成的代码(existingcode)时,设置为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语句,也可以借助于查询生成器来辅助生成。 不管用哪种,都应使用如下查询: 1 2 3 4 SELECTProducts.ProductID,Products.ProductName,Categories.CategoryName FROMCategories INNERJOINProductsON Categories.CategoryID=Products.CategoryID 图14: 使用查询生成器图像化的构造查询 点下一步进入“测试查询”界面,点“完成”结束设置。 完成设置后,GridView的代码应该看起来象下面这样: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 GridViewID="GridView2"runat="server"AutoGenerateColumns="False" DataKeyNames="ProductID"DataSourceID="ProductsWithCategoryInfoDataSource" EnableViewState="False"> BoundFieldDataField="ProductID"HeaderText="ProductID" InsertVisible="False"ReadOnly="True"SortExpression="ProductID"/> BoundFieldDataField="ProductName"HeaderText="ProductName" SortExpression="ProductName"/> BoundFieldDataField="CategoryName"HeaderText="CategoryName" SortExpression="CategoryName"/> GridView> SqlDataSourceID="ProductsWithCategoryInfoDataSource"runat="server" ConnectionString="<%$ConnectionStrings: NORTHWNDConnectionString%>" SelectCommand=" SELECTProducts.ProductID,Products.ProductName,Categories.CategoryName FROMCategories INNERJOINProductsONCategorie
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 46 使用 SqlDataSource 控件 检索 数据