使用SqlDataSource控件查询数据
学习内容:如何通过SqlDataSource控件进行查询并显示数据。跟ObjectDataSource一样,SqlDataSource就像一个代理一样,提供了一个明确的方法以访问数据。它的属性指明了需要连接的数据库以及用来执行的SQL SELECT查询,它们也都可以通过属性窗口或配置数据源向导来进行指定。(SqlDataSource控件还可以含有一个带参数的WHERE子句,其值可以通过编程的方式指定或从某个指定的源自动获取。)
图:比较ObjectDataSource与SqlDataSource
ASP.NET2.0提供了五个内建的数据源控件——SqlDataSource、AccessDataSource、ObjectDataSource、XmlDataSource以及SiteMapDataSource。SqlDataSource可以用来直接访问和修改关系型数据库中的数据。
ObjectDataSource和SqlDataSource都是面向数据的简单代理。ObjectDataSource拥有一些指示对象类型的属性(Properties),这些对象类型提供了数据以及方法以便于查询、插入、更新以及删除。当ObjectDataSource的这些属性被配置好之后,一个数据Web控件(data Web control)——比如GridView、DetailsView或是DataList——就能够绑定它了,并通过ObjectDataSource的Select()、Insert()、Delete()以及Update()方法与潜在的架构进行交互。
SqlDataSource提供了相同的功能,只不过是操作一个关系型数据库而不是一个对象库。通过SqlDataSource,需要给出一个数据库连接字符串,还有SQL语句或是存储过程,然后就可以执行插入、更新、删除、查询操作了。当调用SqlDataSource的Select()、Insert()、Delete()以及Update()方法时,会连接到指定的数据库并发出相应的SQL查询。
实际上,虽然AccessDataSource的确是专门为Microsoft Access而设计的,但SqlDataSource却是为任何能通过.NET访问的关系型数据库而设计的,包括任何兼容OleDb或ODBC的数据存储,比如Microsoft SQL Server、Microsoft Access、Oracle、Informix、MySQL、PostgreSQL……等等。AccessDataSource控件与SqlDataSource控件唯一的不同是数据库连接信息的指定方式。AccessDataSource控件仅需要一个指向Access数据库文件的路径即可,而SqlDataSource则需要一个完整的连接字符串。
ConnectionString属性提供了如何连接到数据库的相关信息。这个属性可以被赋予一个完整的、硬编码的连接字符串,也可以指向Web.config中的连接字符串。要引用Web.config中的连接字符串,需要使用语法<%$ expressionPrefix:expressionValue %>。一般来说,expressionPrefix就是“ConnectionStrings”, expressionValue则是Web.config中<connectionStrings> 节中的连接字符串的名字。不过,这个语法还可以用来引用<appSettings>元素或资源文件中的内容。关于这个语法的详细信息,请参见ASP.NET 表达式概览。
SelectCommand属性给出了一个用于返回数据的SQL语句或是存储过程。
通常来说,数据Web控件所固有的特性——如分页、排序、编辑、删除以及插入等等——是不关心是否使用了数据源控件的。也就是说,GridView可以利用其内建的各种操作,而不用理会是否使用了ObjectDataSource或SqlDataSource。然而,数据Web控件的某些特性却对是否使用了数据源控件或数据源控件的配置是敏感的。
ObjectDataSource可以被配置为支持自定义分页,以精确的返回需要显示的记录子集。然而,SqlDataSource却缺少用于实现自定义分页的属性。SqlDataSource中出现了另外的关于分页和排序的小东西。默认情况下,SqlDataSource返回的数据将通过GridView来分页和排序。分页和排序都如预期的那样工作了,这是因为SqlDataSource把获取到的数据放到了一个弱类型的DataSet中。查询所返回记录的总数——实现分页所不可或缺的部分——可通过这个DataSet弄清楚。此外,DataSet的结果还可以通过DataView来进行排序。在GridView需要对数据进行分页或排序时,这些能力将自动的被SqlDataSource使用。
SqlDataSource可以被配置为返回一个DataReader而不是DataSet,只需要将其DataSourceMode属性从DataSet(默认)改成DataReader即可。在需要将SqlDataSource的结果传递给现有的需要DataReader的代码时,使用DataReader可能是比较好的做法。而且,由于DataReader是比DataSet简单很多的对象,所以它们能提供更好的性能。不过,如果你做了这样的修改,数据Web控件将不能再进行分页,因为SqlDataSource不能准确的获知到底有多少记录被返回,当然也不能进行排序,因为DataReader根本就没有提供任何可用于对返回的数据进行排序的技术。