创建ASP.NET数据存储层
|
摘要:学习如何使用 SQL Server 2000 和 Visual Studio .NET 2003 为 DotNetKB ASP.NET 解决方案创建数据存储层。此外,还讨论了有关 SQL Server、IIS 和 ASP.NET 的安全性问题。 使用 Visual Studio .NET 2003 创建数据库图 2、查看按日期排序的问题列表(按日期倒序排列) 3、查看按主题排序的问题列表(按主题的字母顺序/问题的日期倒序排列) 4、查看某个特定主题的问题列表(按日期倒序排列) 5、查看无任何解答的问题列表(按日期倒序排列) 6、查看问题计数 7、查看无解答的问题计数 8、查看某个特定主题的问题计数 9、查看由某位专家解答的问题计数 10、查看某个问题及其解答列表(按解答日期倒序排列) 11、添加新问题 12、编辑现有问题 13、删除现有问题及其相关解答 如您所见,列表中仅仅涉及到问题记录的任务就有许多。而且您还需要处理解答、主题和专家记录。而在实际工作中,这才刚刚开始。首先,您必须标识需要为每条记录存储的数据元素(问题、解答、主题和专家),还需要将结果以表格的形式组织到 SQL Server 中的数据库中。 创建数据库项目 首先要打开 Visual Studio .NET 2003 并创建一个新的数据库项目。Visual Studio .NET 数据库项目的类型目前还不太确定,因为开始新项目时它隐藏在选项列表中。但开始使用后,我想您会发现数据库项目类型有许多优点,所以非常值得花费精力去掌握它们。 要使用 Visual Studio .NET 创建一个新的数据库项目,需要完成以下任务: 启动 Visual Studio .NET,如果新建项目对话框没有自动出现,请从主菜单中选择 File(文件)-> New(新建)-> Project(项目)。 当显示 New Project(新建项目)对话框时,展开左侧树视图列表中的 Other Projects(其他项目)文件夹,然后单击 Database Projects(数据库项目)文件夹。此时右侧将显示 Database Project(数据库项目)模板。 现在,在 Name:(名称:)输入框中键入项目名称。在我的例子中,键入的是 DotNetKB_Database,不过您可以根据需要键入任何内容。 然后单击 OK(确定)按钮,创建项目并在 Visual Studio .NET 中打开它。 屏幕上将出现一个对话框,要求您选择要与该项目相关联的数据库。此时,先单击 Cancel(取消)。下一步将创建一个新数据库并将其添加到您的项目中。 图 1 所示为您创建项目时,该项目在 Visual Studio .NET 中的外观。 软件开发网 www.mscto.com 图 1:创建一个新的数据库项目 创建要使用的新数据库之后,可以在该数据库与您的项目之间建立一个连接,以便在 Visual Studio .NET 2003 中对其进行操作。为此,需要完成以下任务: 在 Solution Explorer(解决方案资源管理器)窗口中,展开您的 dotNETKB_Database 项目,以显示 Database References(数据库引用)项。 在 Database References(数据库引用)项上单击鼠标右键,然后从上下文相关菜单中选择 New Database Reference...(新建数据库引用...),打开 Data Link Properties(数据链接属性)对话框。 输入您在其中添加 DotNetKB 数据库的数据库服务器的名称,然后输入您的登录凭据并从下拉菜单中选择 DotNetKB。 单击 OK(确定)按钮,将引用添加到您的项目中。 图 2 所示为完成上述操作时对话框的外观。 ![]() 图 2:Data Link Properties(数据链接属性)对话框 至此,数据库创建完毕并被添加为您项目的引用。下一步,定义存储 DotNetKB 解决方案数据所需的表。 软件开发网 www.mscto.com
[1] [2] [6] [7]
使用 Visual Studio .NET 定义数据库表 重要名词以粗体表示。阅读方案说明时,这些名词或表名(例如,“问题记录”就是一个很好的例子)往往能够表明需要存储哪些数据。使用上述信息,您可以在数据库图中添加一个新表并定义所需的列。下面的示例详细介绍了如何在数据库图中添加表。 在图“surface”上单击鼠标右键并从上下文相关菜单中选择 New Table...(新建表...)。输入 Questions(问题)作为表名,然后单击 OK(确定)将其添加到图中。 在 Questions(问题)表对话框中,键入上文所述方案中提供的字段信息。例如,Column Name(列名)= ID、Data Type(数据类型)= int、Length(长度)= 4,并取消选择 Allow Nulls(允许为空)复选框。对该表的其余部分重复上述操作(参见图 3)。 ![]() 图 3:Questions(问题)表 您将看到,第一列 (ID) 旁边有一个小的金色键。它表示该字段是该表的主键字段。要设置主键字段,可以在列表中的列名上单击鼠标右键,然后从上下文相关菜单中选择 Primary Key(主键)。另外,还应将此 ID 字段设置为以增量方式自动增加的标识列。这样,SQL Server 就可以为添加到表中的每条记录自动生成一个唯一的整数值。要进行此设置,请在该列上单击鼠标右键,从上下文相关菜单中选择 Properties(属性),然后在 Property Pages(属性页)对话框中选择 Columns(列)选项卡。其他的操作就很容易了(参见图 4)。 ![]() 图 4:Property Pages(属性页)对话框中的 Columns(列)选项卡 使用“添加主题记录”和“添加解答记录”方案中的信息,可以创建其他两个表。请务必为每个表创建 ID 列,并将这些列标记为标识列和主键。下面的图 5 显示了三个已完成的表。 ![]() 图 5:三个已完成的表 您会发现,这些表都通过连接线与数据库图连接起来。这些连接线表明表之间存在外键关系。例如,Questions(问题)表中的 TopicID 列与 Topics(主题)表中的 ID 列相关联。通过将这种关系存储到数据库中,您可以制定用以防止在数据库中保存非法数据的规则。本示例中的关系规则是,Questions.TopicID 列所允许的有效值只能是 Topics.ID 列中已存在的某条记录的值。 您可以通过将 Questions(问题)表中的 TopicID 列拖放到 Topics(主题)表中的 ID 列上,来定义这些关系。此时将出现一个对话框,显示规则定义的详细信息并要求您按下 OK(确定)按钮进行确认(参见图 6)。 ![]() 图 6:Create Relationship(创建关系)对话框 您可能会发现,Responses.QuestionID 和 Questions.ID 之间也定义了一个关系。 注意:您可能已经注意到,我们还没有为专家定义任何表。我决定将有关专家的信息存储在一个 XML 文件中,而不是存储在数据库中。这样做的主要原因是我们可以借此讨论一下如何读写 XML 数据,以便在同一个应用中融合 XML 数据和关系数据。我们将在下一部分中讨论有关专家数据的问题。 至此,数据库和表都已定义完毕。以上介绍了解决方案的实际数据存储过程。但是,我们还需要了解如何在表中读写信息。为此,我们将定义 SQL Server 中的存储过程。
[1] [2] [6] [7] 软件开发网 www.mscto.com 软件开发网 www.mscto.com 使用 Visual Studio .NET 2003 编写存储过程 相反,存储过程可以保持代码的简洁明了,可以提供额外的安全保护,并能提高解决方案的性能。这些都是摒弃内置查询语句而使用存储过程的原因。 将存储过程添加到 Visual Studio .NET 数据库项目中 使用 Visual Studio .NET 2003 创建存储过程非常简单。首先,您需要打开一个数据库项目。这一操作已在本文第一部分中完成。然后,您可以使用代码模板创建存储过程,也可以针对 Server Explorer(服务器资源管理器)窗口中连接的数据库,使用 Visual Studio .NET 2003 直接编辑新的存储过程。本文重点介绍如何针对连接的数据库服务器直接编辑存储过程。稍后会介绍如何为以后的远程服务器安装生成所有结果脚本。 介绍使用 Visual Studio .NET 2003 编写存储过程的机制之前,还要重点强调一下与创建可靠的存储过程相关的几个一般问题。首先,最好将创建和执行存储过程的整个过程看作是多层应用程序模型的一个成熟成员。存储过程提供了一种对您的数据存取进行编程的方法。这样,您可以更好地控制整个解决方案并提高其效率。也就是说,应将存储过程集合看作是应用程序中一个独立的层。优秀的数据存取策略应允许存储过程作为独立的组件而存在。也就是说,存储过程层中需要具备安全性、错误处理以及其他构成优秀组件层的详细内容。更重要的是,应像在其他高级编程环境中那样访问 T-SQL 语言,而不是仅仅将其作为一种生成数据库查询的方式。 注意:现在,我怀疑有些读者可能在想他们并不打算对 SQL Server 进行编程,或者认为这项工作最好留给那些 DBA 们来完成。虽然具备数据库管理员经验会有所帮助,但并一定非要成为火箭科学家(这里指技艺高超的编程专家)才能很好地完成 SQL Server 编程工作。像其他语言一样,这种语言也需要花费一定的时间并通过一定的实践才能熟练掌握,在这一点上它与其他语言并没有太大的不同。如果您能够在 Microsoft Visual Basic? .NET 中编程,也就能够在 T-SQL 中编程。 软件开发网 www.mscto.com
[1] [2] [6] [7]
使用 Visual Studio .NET 添加存储过程
在本示例中,还有几点需要指出。首先,您会在存储过程顶端看到一个参数列表。除前两个参数外,其他参数均被标记为 OUTPUT 参数。这些参数用于返回选定记录的值。使用一条记录的返回值要比返回带有所有字段的记录集合更为高效。 其次,您会发现用于检查 @AdminCode 参数值的 T-SQL 数据块,以确保传递正确的代码。如果传递的代码不正确,则传递返回代码 100 并停止执行该过程。再其次,您会发现检查 @ID 参数,以确保其代表一条现有记录。如果不是现有记录,则传送返回代码 101 并终止执行。最后,如果输入变量都有效,存储过程将尝试选择记录并返回相应的值。如果此时发生任何错误,将由该过程的最后一行代码进行处理。 注意:通常情况下,最好将自定义错误代码及其含义保存在数据库中的一个单独的表格中,或保存在解决方案可以访问的文本文件中。这样就可以轻松更新这些错误代码,并与解决方案中的其他子系统共享。因为这只是一个短小的示例,其中只使用了两个错误代码,所以我决定创建一个包含大量代码和消息的文档,以供其他子系统参考。 该解决方案中包含的存储过程超过 25 个。本文仅举一例进行说明,其他代码可以通过本文开始处的链接进行下载。最后这个示例使用一个自定义的内置标量函数。 使用自定义标量函数 有时,单独一个存储过程不足以解决问题。例如,我们的用户方案中就有一个方案要求列出某个问题的解答数目。解决此问题的方法之一是生成一个对问题的解答进行计数的子查询。另外一种方法是生成一个自定义函数,返回标量值并将其包含在问题查询中。这种方法还有一个好处,那就是我们可以在其他存储过程中再次使用该标量函数。 添加自定义函数的操作类似于添加存储过程。在 Server Explorer(服务器资源管理器)树中,在选定数据库的 Functions(函数)节点上单击鼠标右键,然后从上下文相关菜单中选择 New Scalar-Valued Function(新建标量值函数)。然后在编辑器中编辑该文档,并像保存存储过程那样保存该文档。 以下是自定义函数的代码:
以下是使用自定义函数的存储过程:
了解如何编写存储过程和自定义函数之后,我们还将讨论使用 Visual Studio .NET 2003 创建数据层时的另一个问题,即安全性问题。 软件开发网 www.mscto.com
[1] [2] [6] [7]
IIS、ASP.NET 和 SQL Server 的安全性问题 第一步是生成一个新的 Windows 用户(本例中称为 DotNetKB),为其设置一个增强型密码,然后将其添加到 Windows 来宾组 (Guest Windows Group) 中。同时,确保选中 Password never expires(密码永不过期)和 User cannot change password(用户不能更改密码)复选框。这样将生成一个权限有限的用户,在 IIS 中运行您的 Web 应用程序时,您可以将其用作标识(参见图 7)。 ![]() 图 7:生成的权限有限的用户 然后,调用 Internet 信息服务器管理员并选择承载这些网页的 Web 应用程序。在本例中,您可以选择承载前文所生成的测试页的 Web 应用程序 (DotNetKB_WebSite)。在树视图中的 Web 应用程序上单击鼠标右键,然后从上下文相关菜单中选择 Properties...(属性...)。然后选择 Directory Security(目录安全性)并单击该对话框 Anonymous access and authentication control(匿名访问和验证控制)部分中的 Edit(编辑)按钮。最后,输入自定义用户名 (DotNetKB),取消选择 Allow IIS to control password(允许 IIS 控制密码)复选框,并输入该自定义用户帐户的密码。完成所有这些工作之后,单击 OK(确定)按钮,将这些更改保存到 IIS 配置数据库中(参见图 8)。 软件开发网 www.mscto.com ![]() 图 8:Authentication Methods(验证方法)对话框 此时,IIS 将在一个权限有限的自定义帐户下运行。任何访问者访问您应用程序的网页时,都将以这个自定义用户身份运行,且只具有该自定义用户的验证权限。 授权 DotNetKB 用户帐户访问 SQL Server 然后,您需要为该自定义用户授予访问数据库 (DotNetKB) 的相应权限。为此,您可以使用 Microsoft SQL Server 企业管理器或编写一个自定义脚本,以创建一个这样的用户并授予其访问特定对象的权限。本文介绍如何使用 SQL Server 企业管理器完成此操作。您还可以从后文中看到一个脚本示例。 注意:尽管 Visual Studio .NET 2003 具有与 SQL Server 兼容的许多强大的集成功能,但也不允许从 Visual Studio .NET 2003 中轻松管理用户和用户权限。在大型的组织和团队中,这些高级任务通常由数据库管理员完成。 因此,启动 SQL Server 企业管理器之后,您可以按照以下步骤将自定义用户 (DotNetKB) 添加数据库中(参见图 9): 在左侧的树视图中,展开节点以显示 DotNetKB 数据库。在我的计算机上,树视图的结构如下:Console Root | SQL Server Group | (LOCAL) (Windows NT) | Databases | DotNetKB。 然后,在数据库下的 Users(用户)节点上单击鼠标右键,并选择 New Database User...(新建数据库用户...)。显示 Database User Properties - New User(数据库用户属性 - 新建用户)对话框时,从 Login name(登录名)下拉框中选择 <new>(<新建>)。 显示 SQL Server Login Properties - New Login(SQL Server 登录属性 - 新建登录)对话框时,选择 General(常规)选项卡,并在 Name(名称)输入框中输入 DotNetKB。确保选中 Windows Authentication(Windows 验证)单选按钮,并从 Domain(域)下拉框中选择自定义用户帐户所在的计算机的名称。然后从 Database(数据库)下拉框中选择 DotNetKB。 现在,选择 Databases(数据库)选项卡,在对话框顶部的列表中找到 DotNetKB 数据库并选中它。然后,确保选中对话框底部列表中的 public(公共)角色。最后,单击对话框底部的 OK(确定)按钮,保存您的更改。 图 9:在数据库中添加自定义用户 然后,您需要为 DotNetKB 数据库中的所有存储过程和自定义函数添加执行权限。为此,您只需为 public(公共)角色授予权限。您可以将权限授予 DotNetKB 用户,这样将使以后的登录(当这些用户获得访问 DotNetKB 的权限时)更容易执行存储过程,而不需要为每个用户添加新的权限。 下面是为 DotNetKB 数据库中的存储过程和函数授予执行权限的步骤: 突出显示树视图中 DotNetKB 数据库下的 Users(用户)节点,以显示此数据库的用户列表。找到 DotNetKB 用户并在其上双击,打开 Database Users Properties(数据库用户属性)对话框。 突出显示(选中)public(公共)角色时,单击 Properties...(属性...)按钮,打开 Database Role Properties(数据库角色属性)对话框。然后单击 Permissions...(权限...)按钮,显示数据库对象和权限设置列表。 选中对话框顶部 Database role(数据库角色)下拉列表中的 public(公共)角色之后,找到为此数据库定义的所有存储过程和自定义函数(可能需要展开对话框才能看到全名),并确保选中各项旁边的 EXECUTE(执行)复选框。您可能会发现某些系统对象的其他一些复选框也被选中了,请不要更改这些选项。 最后,设置所有的 EXECUTE(执行)权限后,单击 OK(确定)按钮,保存更改并关闭对话框。依次单击 OK(确定)按钮,直到所有对话框均被关闭。 至此,您已为 IIS 创建了自定义用户,并设置了该用户在 SQL Server 中的相应权限。现在,您需要在 ASP.NET Web 项目中进行一个配置更改,确保 ASP.NET 使用同一个用户帐户执行对 SQL Server 的所有调用。 设置您的 ASP.NET 应用程序以模拟 DotNetKB 用户 为 IIS 下运行的 ASP.NET Web 应用程序生成坚实可靠的配置的最后一个步骤是:配置 ASP.NET Web 应用程序,使之能够接受来自 IIS 的 Windows 用户标识并能用于访问其他操作系统资源。为此,您只需在 web.config 根文件中输入一行代码。 注意:尽管目前我们还没有真正开发出用于承载我们的页面的 ASP.NET Web 应用程序,但您可以使用这些信息在生成测试页的下一节中验证数据访问层的功能。 修改后的 web.config 文件如下所示:
请注意,您只需添加 <identity> 元素并将模拟特性设置为 true(真)。不必输入用户帐户或密码,因为这些信息将由 IIS 提供。也就是说,即使其他人能够读取您的配置文件,他们也无法确定使用哪些标识凭据来执行您的 Web 应用程序。 至此,您已生成了自定义用户,并为其设置了访问 SQL Server 和 IIS 的相应权限。现在,我们来创建一些测试页,确保它能够正常工作。从这里您可以看出一切正常。
[1] [2] [6] [7]
创建 ASP.NET 测试页
请注意,本方法中实际执行的唯一操作是由 GetItem(ID) 方法调用处理的。它执行数据库调用并使用返回的值设置本地变量。以下是 GetItem 方法的代码。请注意,它使用了大量的 SqlParameter 对象来处理输入和输出值。
GetItem 方法的另一个重要方面是使用了返回值参数。它在前几行代码中进行声明,并在执行存储过程后进行检查。请注意,我检查了已知错误代码 100 和 101。有关其他错误的处理方法,我们将在以后介绍如何创建成熟的中间层时进行介绍。问题在于,我要利用返回值并在需要时抛出一个自定义异常。 对于本解决方案示例,我最终生成了六个 Web 表单,并用它们测试了将近 30 个存储过程和自定义函数。您可在本文开始部分列出的下载软件包中找到所有这些完成的表单。 现在我们已经定义了表、创建了存储过程和函数并生成了 ASP.NET Web 表单,因此可以使用 Visual Studio .NET 2003 生成数据库层的安装脚本了。数据库管理员(有时是您自己)可以将此脚本应用到生产服务器上。
[1] [2] [6] [7]
生成源代码和安装脚本 在 General(常规)选项卡上,选中 Script all objects(编写全部对象脚本)复选框。 在 Formatting(格式化)选项卡上,选中除最后一个复选框以外的所有复选框(仅与 7.0 版脚本兼容的功能)。仅在您的目标服务器是 SQL Server 7.0 而不是 SQL Server 2000 时,才需要最后一项。 在 Options(选项)选项卡上,在 Security Scripting Options(安全性脚本选项)部分,选中除 Script SQL Server logins(撰写 SQL Server 登录脚本)之外的所有选项。确保选中 Table Scripting Options(表脚本选项)部分中的所有复选框。同时保留 File Format(文件格式)和 Files to Generate(生成的文件)的默认单选按钮。最后,当所有设置均已设置正确时,单击 OK(确定)按钮开始脚本生成过程。 系统将提示您指定文件位置。默认情况下,Visual Studio .NET 将指向现有数据库项目中的 Create Scripts(创建脚本)文件夹。单击 OK(确定)按钮接受此默认位置。 该过程完成后,您将获得保存数据库中各对象的文件列表。此脚本集合还包含了用于创建相应的用户并为其授予正确权限的脚本。您甚至可以将这些信息保存到 Visual SourceSafe 中,用于处理以后的版本问题。最后,您可以根据需要将这些文件传送给其他人,使他们可以直接更新或更改这些文件。至此,已经完成了数据库层的完整源代码。 生成安装脚本 最后一个步骤是让 Visual Studio .NET 2003 生成一个命令行脚本,用于读取所有 T-SQL 脚本并根据目标 SQL Server 运行这些脚本。为此,需要完成以下步骤。 在 Solution Explorer(解决方案资源管理器)中,在项目名称 (DotNetKB) 上单击鼠标右键,然后从上下文相关菜单中选择 Create Command File...(创建命令文件...),打开 Create Command File(创建命令文件)对话框。 如果需要,可以更新 Name of Command File(命令文件名称)输入框,然后选择合适的验证方案(除非您需要远程连接服务器,否则请使用 Microsoft Windows? NT?)。最后,单击 Add All(全部添加)按钮,以便将所有 T-SQL 脚本都包含在安装操作中。 然后,单击 OK(确定)按钮生成脚本。这样即可将完整的脚本加载到编辑器窗口(参见图 12)中,您可以在该窗口中检查脚本,所做的更改将在您关闭窗口时得到保存。 软件开发网 www.mscto.com 图 12:生成安装脚本 使用此脚本和 T-SQL 文件集,现在您可以将新数据库层安装到任何您具有相应权限的目标 SQL Server 2000 上了。 小结 本部分讨论了很多内容。包括如何使用 Visual Studio .NET 2003 创建数据库项目,如何创建新数据库以及定义表、索引、约束条件和关系的数据库图,还介绍了使用 Visual Studio .NET 2003 添加可以存取表中存储的数据的存储过程和自定义函数。通过本文的学习,您还学会了如何使用自定义的 Windows 帐户以及 IIS 和 Web 应用程序中的 web.config 文件设置,在 SQL Server 和您的 ASP.NET 解决方案之间建立一种可靠的信任关系。本文最后还介绍了用于验证数据层程序设计的测试 Web 表单示例,并说明了如何生成可用于在任何目标 SQL Server 上安装完成的这个数据层的 T-SQL 脚本和命令行脚本。 也许您已经注意到,数据库层的相关讨论中未涉及到专家记录的存储和再调用过程。这是因为我决定使用 XML 文件代替它。这样,我们可以借此机会学习如何将 XML 作为数据源,以及如何将这种数据格式与 SQL Server 数据结合起来以创建一个完整的解决方案。在下一部分中,我们将定义 XML 存储格式和读写这种数据的组件层,还将学习有关 XML 序列化以及 ASP.NET 中的内置数据高速缓存服务的相关知识。 [1] [2] [6] [7]
源代码网推荐 源代码网供稿. |

软件开发网 www.mscto.com 






