asp.net 2.0包含了accessDataSource控件,用来从Access数据库中将数据提取至ASP.NET 2.0(.aspx)页面。这个控件拥有的属性很简单。AccessDataSource的最重要的属性是DataFile属性,用来指向硬盘上MDB文件的路径。AccessDataSource拥有的其他属性还有SelectCommand,用来设定一个显示需要返回的结果集(表和列)的语句。SelectCommand必须使用SQL语法来定义。
在VWD中,可以用两种方式来添加AccessDataSource控件至页面。如果MDB文件像前面的示例中那样被添加至Database Explorer中,那么可以拖放列名称至页面上,而且VWD将会自动创建AccessDataSource控件和GridView来显示数据。如果不想使用GridView或者想定制控件,那么可以只从工具框中添加AccessDataSource控件并通过配置向导进行安装。向导将会提示浏览查找数据文件,并且允许通过在数据库的表中选择列来指定SelectCommand。如果是在VWD之外输入页面的,那么可以按照如下所示代码来输入:
<asp:AccessDataSource>
ID="MySourcName"
Runat="server"
DataFile="MyMDBName.mdb"
SelectCommand="SELECT MyField1, MyField2 FROM MyTable">
</asp:AccessDataSource>
需要再次提及的特性很简单。您所要提供的就是一个ID、MDB文件名以及一个SelectCommand。
本文讲述的是关于数据源控件的内容,但是回想起来数据源控件并不在页面上呈现任何可见的东西。所以为了给您一个可见方式来测试数据源控件,下一个“试一试”将介绍使用GridView控件(从ASP.NET 1版本的DataGrid控件演变而来)在表格中显示数据的基本步骤。请注意本章的重点不是在GridView的配置和定制上;在这样的情况下,重点是在数据源控件上。在随后的第5章中,将会更加详细地研究GridView控件。
试一试 #2—— 连接至MDB并用GridView显示数据
在本文事例,将通过页面上的Northwind显示已经销售出去的产品的信息。
(1) 启动页面编辑器并浏览至C:\Websites\BegAspNet2Db\ch02\。
(2) 从Web Form模板中添加名为TIO-ch02-2-DisplayAccessData的页面。单击下方的标签切换至Design视图。
(3) 在页面的顶部,输入标题,例如“连接至MDB数据源的演示”,并将相同的文本放入页面的标题中。虽然在每个练习中都没有讨论过这一步,但是我们建议在每一页中都包含一个标题和HTML文本,这样就不会找不到正在浏览的页面了。
<html>
<head>
<title>TIO ch02-1 Display MDB Data</title>
<head>
<body>
<h3>ch02 TIO 2 Demonstration of connection to an MDB source </h3>
<body>
</html>
(4) 显示工具框(Menu:View|toolbox或者键入Ctrl+Alt+X)并展开工具框的Data面板。
(5) 将一个AccessDataSource控件拖至页面。
(6) 控件的便捷任务面板应当自动出现,如果面板没有自动出现,那么可以选择新的数据源并单击右上方的小箭头来打开便捷任务面板。单击Configure Data Source。
(7) 在Choose a Database步骤,单击Browse 按钮并选择C:\Websites\BegAspNet 2Db\App_Data\Northwind.mdb,并注意设计器将文件说明转换为相对引用,也就是用符号(~)表示站点的根目录。
(8) 在Configure Select Statement对话框中,选择Specify Columns选项并选择PRoducts表。点选星号以选择所有列。依次单击Next、Test Query和Finish。
(9) 选择Data控件并通过按下F4显示Properties窗口。将其ID更改为NorthwindProducts。
(10) 回到工具箱的Data面板,在GridView上双击将控件添加至页面并进入Common Tasks Menu,然后单击Choose Data Source。选择NorthwindProducts并结束向导。
(11) 选择GridView并将其ID更改为NorthwindProducts。页面应该如下所示:
<%@ page language="VB" %>
<html>
<head><title>ch02 TIO 2 Display MDB Data</title></head>
<body>
<h3>ch02 TIO 2 Demonstration of Connection to an MDB Source </h3>
<form runat="server">
<asp:accessdatasource id="NorthwindProductsAccDataSource" runat="server"
selectcommand="Select * From Products"
datafile="~/App_Data/Northwind.mdb">
</asp:accessdatasource>
<asp:gridview id="NorthwindProductsGridView" runat="server"
datasourceid="NorthwindProductsAccDataSource">
</asp:gridview>
</form></body></html>
(12) 打开浏览器并查看C:\Websites\BegAspNet2Db\ch02\ch02_TIO_2_ Dis- playAccessData.aspx(参见图2-2)。
图 2-2
(13) 最后的操作是从MDB Query而不是表中显示数据。关闭浏览器并返回至VWD。用新名称ch02_TIO_2_DisplayAccessData-Query.aspx保存文件。选择GridView并通过单击控件右上方的小箭头来打开它的Common Task Menu。单击Configure Data Source和Next跳过MDB文件的选择。在Configure Select Statement的界面上,将名称改为“销售分类”并点选星号以获得所有的字段。这个查询使用JOIN将四个表结合在一起,限制在一个表中使用的记录数并通过一些数据的分组和聚合操作来获得总数。依次单击Next、Test the Query和Finish。数据源控件应当像如下所示:
<asp:accessdatasource id="NorthwindProductsAccDataSource" runat="server"
selectcommand="Selcet * From [Sales by Category] "
Datafile="~/App_Data/Northwind.mdb">
</asp:accessdatasource>
(14) 打开浏览器并查看页面。
示例说明 #2—— 连接至MDB并用GridView显示数据
您有两个页面上的控件。第一个是AccessDataSource,执行连接ADO.NET对象的所有工作,而这些对象连接那些与MDB文件交互的JET引擎。第二个是GridView,用于获取数据并将其格式转化为页面可以显示的HTML格式。请注意给每个控件一个有意义的名称(ID)非常重要。然后必须确定数据绑定控件(GridView)使用它的DataSourceID属性来引用AccessDataSource的ID以便将AccessDataSource作为它的数据源。
从查询中显示数据并不非常困难;在Access中可以不用表名称而使用查询名称。这里有两个说明。第一,如果表或者查询的名称中间有空格,那么必须用方括号将整个名称括起来。第二,需要用户输入(例如,“指定年份的销售”需要知道是哪一年)的查询涉及到的技术不在本书的讨论范围之内。
完成前面几个步骤之后,就可以在页面上看到从AccessDataSource控件获得的数据显示了。后面的章节将详细介绍GridView,但是本章还将继续关注数据源控件。
选择语句中的变量
当在VWD中创建一个数据源时,向导将会要求指定需要显示的列或者要求创建一条定制的SQL语句。在前面的“试一试”中,简单地选择了几个列。可以以几种不同的方式来指定更复杂的SQL语句:
● 使用交互式的对话框
● 在AccessDataSource向导(由控件中的Configure Data Source便捷任务调用)中输入定制的SQL语句
● 在属性网格中输入语句
● 直接在Source视图的标记中输入语句
对那些从单独的表中返回一个或者多个列的简单查询来说,在Access DataSource向导中选择列是一个首选技术,因为它减少了排版和语法所带来的错误(请参见图2-3) 。在这个向导中,可以从Name下拉列表中选择表或者查询的名称。然后您可以通过选择所有列(*)或者任一组列来选择表或者查询中需要的列。如果您单击了Order By按钮,那么您就可以在数据源中按照任何列来进行排序。如果第一个列有约束,那么将会使用在Then By中选择的字段。在您从向导中选择选项的时候,请注意SelectCommand的实际SQL语法也同时显示在一个只读文本框中。
图 2-3
利用向导中的WHERE按钮可以创建带有参数的SQL语句,这部分内容将会在第9章中介绍。现在,我们将跳过这个选择,但是重要的是在部署之前您将使用这些将在本书后面讨论的参数。在一个部署完成的站点中,要避免直接将用户的输入与SQL语句连接。忽略参数问题将会使站点暴露在SQL注入攻击的危险之中。这种攻击技术使用了从用户输入而来的假字符使得原来的SQL语句无效,然后用具有破坏性的语句取而代之。可以使用参数集合来发送用户输入至ADO.NET参数集合,这样可以利用集合的功能减少SQL注入的问题。
虽然Configure Data Source向导具有很多选项可以帮助快速地创建SQL语句,但是有些时候还是需要在标记的SelectCommand中直接输入(或者修改)SQL语句。AccessDataSource向导允许进行这些操作。在选择表、查询和列的向导页面中,可以选择“Specify a custom SQL statement or stored procedure”的单选按钮。在向导页面中选择这个选项之后单击Next按钮将进入另外一个页面,可以直接在文本区域中输入自定义的语句。还可以使用Visual Studio QueryBuilder来可视化地创建自定义语句,所使用的工具与Access QueryBuilder的非常相似。
如果不想使用向导,那么可以选择在AccessDataSource控件的属性网格中输入自定义的SQL语句,或者可以切换至Source视图并在AccessDataSource控件标记的SelectCommand属性中输入语句。
关于SQL有很多书籍(像本书一样类型的还有Beginning SQL Programming,ISBN 1-861001-80-0) ,本书在附录中提供了一个简要的介绍。如果打算学习SQL语法,那么开始阶段可以学习返回记录的一部分(TOP和DISTINCT)的命令、重命名一个字段(AS)的语法,以及从两个相关联的表返回字段的技术(JOIN)。下面的练习将探究SQL语句中的一些变量。
试一试 #3—— 更改AccessDataSource中的选择语句
在本练习中,将要从Northwind的Products表中显示特定的列和特定的记录。还将创建一个页面用来显示从查询中获得的数据。请注意在本练习中,选择规则已经在源代码之中了。目前,还没有将用户输入作为选项。
(1) 在C:\Websites\BegAspNet2Db\ch02\中创建名为ch02_TIO_3_AlternateSelect- Commands.aspx的文件。
(2) 以Northwind作为ID添加一个AccessDataSource控件并设置MDB为\App_Data\Northwind.mdb。在一系列对话框中,设置Select命令从Products表中获取所有的字段( “name”=Products)。查看一下Source视图并注意您所创建的语句,如下所示:
SELECT * FROM Products
(3) 添加GridView,将ID设置为Northwind,将数据源设置为Northwind。如下所示是到目前为止整个页面的样子:
<%@ page language="VB" %>
<html>
<head runat="server">
<title>ch02 TIO 3 Alternate Select Conimands</title>
</head>
<body>
<h3>ch02 TIO 3 Alternate Select Coinmands</h3>
<form runat="server">
<asp:accessdatasource id="NorthwindAccDataSource" runat="server"
selectcommand="SELECT * FROM Products"
datafile=" ~/App_Data/Northwind.mdb" >
</asp:accessdatasource>
<asp:gridview id="GridViewl" runat="server"
datasourceid="NorthwindAccDataSource">
</asp:gridview>
</form>
</body>
</html>
(4) 现在在浏览器中打开页面,并注意如图2-4所示的界面(在截图中没有显示所有的列)。
图 2-4
(5) 回到Design视图并选择AccessDataSource(不是GridView)。打开它的便捷任务面板并单击Configure Data Source。在Configure Select Stat ement窗口中,选择“Specify a custom SQL statement”并单击Next。在编辑器中修改SQL语句,如下所示:
SELECT * FROM [Products] WHERE (CategroyID=3)
(6) 单击Next并测试查询。单击OK关闭对话框。查看一下Source视图中的页面并注意如下代码:
<asp:accessdatasource id="NorthwindAccDataSource" runat="server"
selectcommand="SELECT * FROM [Products] WHERE (CategoryID = 3) "
Datafile="~App_Data/Northwind.mdb">
</asp:accessdatasource>
(7) 试着使用对话框来创建如下一些Select命令,也可以在Source视图中输入,或者两者结合起来使用。
SELECT * FROM Products WHERE ProductID = 12
SELECT * FROM Products WHERE ProductName = 'Northwoods Cranberry Sauce'
SELECT * FROM Products WHERE ProductID <11
SELECT * FROM Products WHERE ProductID <11 ORDER BY ProductName Ascending
SELECT * FROM Products WHERE SupplierID = 6 OR SupplierID = 8
SELECT * FROM Products WHERE SupplierID = 24 AND UnitPrice > 10
示例说明#3—— 更改AccessDataSource中的选择语句
在首先几个步骤中,像前面一样创建了一个AccessDataSource控件和GridView。但是随后开始用Select语句进行试验。通过复选框添加和删除列是最直观的。还可以在编辑器窗口中直接输入(或者编辑)SQL语句。
添加了WHERE子句用来限制从MDB文件中返回的记录。如果列名没有包含空格,那么可以省略方括号。如果在列名中包含了空格,那么就必须使用这些方括号。
MDB文件位置中的变量
MDB文件保存在硬盘中的各种物理位置上:与Web页相同的文件夹、Web页下的子文件夹或者机器中的其他文件夹等。在Visual Web Developer中,可以在设计器中经常浏览这些文件,并且MDB文件的正确路径也已经输入好了。但是,如果您打算输入自己代码的话,还需要遵循本节所介绍的语法。
AccessDataSource控件的DataFile属性包含的页面路径可以是完全限定的(例如以驱动器盘符开头)也可以是相对于包含AccessDataSource的页面的位置而指定的。路径还可以是相对于应用程序的,即使用URL语法来引用路径。这个语法将符号(~)替换为应用程序根目录,比如:~\App_Data\produces.mdb。使用相对于应用程序的路径可以更加容易地将页面从一个位置移动到另外一个位置而不破坏对数据库的引用,所以推荐在可能的时候都使用相对于应用程序的路径。
首先,我们来看完全限定路径的语法,它包含了MDB文件的整个路径,以文件所在的计算机驱动器的根目录开头:
<asp:accessdatasource . . .
datafile= "C:\WebSites\Webapplication\App_Data\MyMdb.mdb">
虽然这个语法可以使用,但是它的不足之处就是降低了应用程序的可移植性。如果要移动这个应用程序至另外一台机器上,那么驱动器或者文件的完全限定路径就会不一样,而且在每次移动页面的时候,您都需要修改DataFile属性。
对完全限定路径的一个改进就是使用相对路径语法,它只需要指定与包含了AccessDataSource的页面的完全限定路径不相同的部分。下面是与页面相同文件夹中数据库文件的路径语法,以相对路径指定:
<asp:accessdatasource . . . datafile="MyMdb.mdb">
因为页面和MDB文件同处一个目录,所以这些文件的路径没有区别;因此,只需要指定各自的文件名即可。如果MDB处于该文件夹的下一级或更多级目录中,那么下面的语法与前面的非常类似。在这样的情况下,只需要指定子文件夹名称,再添加斜杠和MDF文件名:
<asp:accessdatasource . . . datafile="MyDaughterFolder/MyMdb.mdb">
如果MDB文件处于页面目录的上级目录中,那么也可以使用双句点语法来指定当前位置的上一级目录:
<asp:accessdatasource . . . datafile="../MyMdb.mdb">
通过使用相对路径语法,可以很容易地将应用程序从一个地方移动至另外一个地方而不用改变MDB文件的路径。因为页面和MDB文件总是形影不离(假如MDB文件是应用程序的一部分),所以这些文件的相对位置总是保存一致。但是,当打算在应用程序内部移动路径,例如将页面移动至子目录中,那将会发生什么呢?在这样的情况下,页面和MDB文件之间的相对位置发生了改变,那么相对路径语法也就不正确了。
应用程序相对语法解决了这个问题。此时,路径总是相对于应用程序根目录来指定的,而不是相对于页面本身。根目录表示为符号(~):
<asp:accessdatasource . . . datafile="~App_Data/MyMdb.mdb>
现在可以容易地移动应用程序、或者在应用程序内移动页面而不用改变对数据库的引用了。所以,应当在可能的时候都使用应用程序相对路径。