第7章数据库与ADO.NET基础数据库在任何应用程序开发中都非常的重要,特别在ASP.NET应用程序开发中,数据库通常被用来保存用户的信息、文章内容等数据,同时数据库也能够提供用户进行查询、搜索等操作。传统的纯静态HTML页面已经不能满足互联网的发展应用,使用数据库能够让网站与用户、新闻、投票等信息进行良好的整合。7.1数据库基础要了解数据库,首先就要掌握数据库基础,数据库就是存放数据的仓库。当开发人员在应用程序的开发中,可以将任何可以抽象成数据的信息存放在数据库中,数据库的特点是数据能够按照数据模型组织进行存取,数据库是高度的结构化并且可以为多个用户共享的。7.1.1结构化查询语言结构化查询语言简称“SQL”,最早的是圣约瑟研究实验室为其关系数据库管理系统SYSTEMR开发的一种查询语言。现今的数据库,无论是大型的数据库,如Oracle、Sybase、Informix、SQLserver这些大型的数据库管理系统,还是VisualFoxpro,PowerBuilder这些微机上常用的数据库开发系统,都支持SQL语言作为查询语言。SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作,它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同的底层结构的不同数据库系统都可以使用相同的SQL语言作为数据输入与管理的接口。它以记录集作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语言可以嵌套,这也使SQL语句具有极大的灵活性和强大的功能。在多数情况下,在其他语言中需要一大段程序实现的一个单独事件只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。下面给出一组例子来演示SQL语句的使用方法。1.查询表中所有记录通过使用select关键字进行查询,示例代码如下所示。SELECT*FROMNEWS2.带条件的查询语句通过使用where语句进行带条件的查询,示例代码如下所示SELECT*FROMNEWSWHERETITLE=‘新闻’3.使用函数语句中也可以使用内置函数,示例代码如下所示。SELECTCOUNT(*)ASMYCOUNTFROMNEWS4.插入数据语句179通过使用insert进行插入数据库操作,示例代码如下所示。INSERTINTONEWSVALUES(‘新闻’,’2008/9/9’,’新闻内容’)5.删除数据语句通过使用delete关键字删除数据库中的数据,示例代码如下所示。DELETEFROMNEWSWHEREID=1注意:当delete后面的条件没有限定时,则会删除该表的所有数据。6.更新数据语句通过使用update关键字更新数据,示例代码如下所示。UPDATENEWSSETTITLE=‘新闻标题’WHEREID=‘1’注意:SQL并不区分大小写,但是推荐使用大写来书写SQL语句,这样能够在应用程序中清晰的辨认。7.1.2表和视图表是关系数据库中最主要的数据对象,开发人员通过创建表并向表中进行数据操作来存储和操作数据,表是用来存储和操作数据的一种逻辑结构。表通常以二维表形式呈现,在SQLServerManagementStudio中可以看见表的结构,如图7-1所示。图7-1表的表现形式创建表可以使用SQL语句进行创建,下面是创建表的表脚本代码。CREATETABLE[dbo].[news]([id][int]IDENTITY(1,1)NOTNULL,[title][nvarchar](50)NULL,[time][datetime]NULL,[content][ntext]NULL,)上述代码创建了一个新闻表并且该表具有4个字段,这4个字段分别为id、title、time和content,表是一个具体的表,用于数据的存放和读取。视图不同于表,视图并不是实际存在的表,视图是一种虚拟的表,视图将存在的表中按照一定的规则读取若干列,组成新的结果集,视图在物理上并不存在。当对视图进行操作时,系统会根据视图的定义去操作与视图相关联的基本表。视图有助于隐藏现有的表中的数据,创建视图代码如下所示。CREATEVIEWmyviewas180SELECTtitle,[time]fromnews上述代码创建了一个视图,是基于查询语句selecttitle,[time]fromnews所查询的集合的。注意:视图不是一个表,是一个虚拟的表,视图可以是多个表的集合、筛选形成的新表,视图是这些表的一个结果集。7.1.3存储过程和触发器存储过程是一组为了完成特定功能的SQL语句集,在编写完成后,系统会编译代码并存储在数据库中。用户只需要指定存储过程的名字并给出传递的参数,就可以使用存储过程。存储过程的概念有点像应用程序开发中的方法。1.存储过程存储过程是数据库中一个非常重要的对象,使用好存储过程能够将数据库应用与程序应用相分离。当维护与数据库相关的功能的时候,只需要维护存储过程即可,另外使用存储过程能够提升性能,存储和过程会在运行中被编译,当没有显著的数据更新时,可以直接从编译后的文件中获取相应的结果。存储过程优点如下所示:存储过程允许标准组件式编程。存储过程的执行速度较快。存储过程能够减少网络流量,降低应用程序读取数据库的次数。存储过程比查询语句更加安全。存储过程声明语法如下所示:CREATEPROC[EDURE]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,...n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[...n]存储过程的各个参数的使用如下所示。procedure_name:新存储过程的名称,过程名必须符合标识符规则,且对于及其所有者必须惟一。number:是可选的整数,用来对同名的过程分组,以便用一条DROPPROCEDURE语句即可将同组的过程一起除去。@parameter:过程中的参数。在CREATEPROCEDURE语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值。data_type:参数的数据类型。所有数据类型如text、ntext和image均可以用作存储过程的参数,而与之不同的是,cursor数据类型只能用于OUTPUT参数。VARYING:指定作为输出参数支持的结果集,其由存储过程动态构造,内容可以变化,VARYING仅适用于游标参数。default:参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程,默认值必须是常量或NULL,如果过程将对该参数使用LIKE关键字,那么默认值中可以包含通配符(*、_、[]和[^])。181OUTPUT:表明参数是返回参数。该选项的值可以返回给EXEC[UTE]。使用OUTPUT参数可将信息返回给调用过程。n:表示最多可以指定2.100个参数的占位符。{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}:RECOMPILE表明SQLSERVER不会缓存该过程的计划,该过程将在运行时重新编译;ENCRYPTION表示SQLSERVER加密syscomments表中包含CREATEPROCEDURE语句文本的条目;使用ENCRYPTION可防止将过程作为SQLSERVER复制的一部分发布。通过以上参数可以声明一个存储过程,示例代码如下所示。CREATEPROCEDUREUpdatenewsInfo@IDint,@titlenvarchar(50),@timedatetime,@contentntext,ASUPDATE[newsInfo]SetNewsTitle=@title,NewsDatetime=@timewhere[ID]=@IDGO上述代码创建了一个名为“Updatenewsinfo”的存储过程,该存储过程作用是修改新闻表中的相应的字段的值。2.触发器触发器实际上也是一种存储过程,不过触发器是一种特殊的存储过程,当使用UPDATE,INSERT或DELETE的一种或多种对指定的数据库的相关表进行操作时,会触发触发器。触发器的语法格式如下所示。CREATETRIGGERtrigger_nameON{table|view}[WITHENCRYPTION]{{{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE]}[WITHAPPEND][NOTFORREPLICATION]AS[{IFUPDATE(column)[{AND|OR}UPDATE(column)][...n]|IF(COLUMNS_UPDATED(){bitwise_operator}updated_bitmask){comparison_operator}column_bitmask[...n]}]sql_statement[...n]}}其中,触发器的各个参数的使用如下所示。trigger_name:是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须惟一,开发人员可以选择是否指定触发器所有者名称。Table|view:是在其上执行触发器的表或视图,有时称为触发器表或触发器视图,可以选择是否指定表或视图的所有者名称。182WITHENCRYPTION:加密syscomments表中包含CREATETRIGGER语句文本的条目。使用WITHENCRYPTION可防止将触发器作为SQLServer复制的一部分发布。AFTER:指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发,所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。INSTEADOF:指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。{[DELETE][,][INSERT][,][UPDATE]}:是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字,必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。WITHAPPEND:指定应该添加现有类型的其他触发器,只有当兼容级别是65或更低时,才需要使用该可选子句。NOTFORREPLICATION:表示当复制进程更改触发器所涉及的表时,不应执行该触发器。AS:是触发器要执行的操作。sql_statement:是触发器的条件和操作,触发器条件指定其他准则,以确定DELETE、INSERT或UPDATE语句是否导致执行触发器操作。触发器可以包含复杂的SQL语句,主要用于强制复杂的业务规则或要求。同时,触发器也能够维持数据库的完整性,当执行插入、更新或删除操作时,触发器会根据表与表之间的关系,强制保持其数据的完整性。7.2使用SQLServer2005管理数据库SQLServer2005是微软继SQLServer2000后5年发布的一款新的数据库产品。SQLServer2005不仅增加了许多功能,同时也在UI、管理工具、性能上做了很多的优化。使用SQLServer2005管理网站数据库,不仅提高了开发中数据的存储和读写的效率,也更加方便了数据的管理。7.2.1初步认识SQLServer2005相比于SQLServer2000,SQLServer2005在安装上更加的简单,基本上无需手动配置任何事情即可安装。在安装之前,SQLServer2005会检查宿主机器的配置是否适合安装SQLServer2005,如果机器的配置适合安装SQLServer2005,则会进入安装主界面。SQLServer2005的安装向导是基于Windows的安装程序,用户使用起来更加友好,并且在安装过程中为用户提供了可选方案,让用户选择自己需要的组件安装。当安装完毕后,用户可以打开SQLServer