490 likes | 721 Views
第 6 章 ADO.NET 数据访问接口. 6. 内容提要. 本章首先介绍 ADO.NET 的结构。 然后将对 ADO.NET 的 Connection 对象, Command 对象、 DataReader 和 DataAdapter 对象作深入的研究。 作为数据库的基础,将对 SQL 语句作简要的介绍,介绍基本查询语句、聚合函数、分组查询以及交叉查询。 最后介绍常用的数据控件: Repeater 数据控件、 DataList 数据控件和 DataGrid 数据控件。. ADO.NET 的结构. 数据提供程序. 表 6-1 .NET 数据提供程序的四个核心对象.
E N D
内容提要 • 本章首先介绍ADO.NET的结构。 • 然后将对ADO.NET的 Connection对象,Command对象、DataReader和DataAdapter对象作深入的研究。 • 作为数据库的基础,将对SQL语句作简要的介绍,介绍基本查询语句、聚合函数、分组查询以及交叉查询。 • 最后介绍常用的数据控件:Repeater数据控件、DataList数据控件和DataGrid数据控件。
数据提供程序 • 表6-1 .NET 数据提供程序的四个核心对象
SQL Server .NET 数据提供程序 • 对应SQL Server.NET的4个核心对象分别是:SqlConnection、SqlCommand、SqlDataReader和SqlDataAdapter。这4个对象包含在System.Data.SqlClient命名控件中,需要将这个命名空间引入到文件中。 • SQL Server.NET数据提供程序对SQL Server数据库的底层操作进行了封装,可以更加快捷的访问SQL Server数据库。目前主要用来操作SQL Server 2000或者SQL Server2005。
OLE DB .NET 数据提供程序 • 对应OLE DB .NET的4个核心对象分别是:OleDbConnection、OleDbCommand、OleDbDataReader和OleDbDataAdapter。这4个对象包含在System.Data.OleDb命名控件中,需要将这个命名空间引入到文件中 • 。 • 目前主要用来访问Access、Foxpro等简单的数据源。
Oracle DB .NET数据提供程序 • 对应Oracle DB .NET的4个核心对象分别是:OracleConnection、OracleCommand、OracleDataReader和OracleDataAdapter。这4个对象包含在System.Data.OracleClient命名控件中,需要将这个命名空间引入到文件中。 • 目前ADO.NET1.1带Oracle DB.NET数据提供程序只支持Oracle8.1.7以上版本,对于其他的Oracle版本还需要到Microsoft网站下载驱动程序。
ODBC.NET数据提供程序 • 对应ODBC .NET的4个核心对象分别是:OdbcConnection、OdbcCommand、OdbcDataReader和OdbcDataAdapter。这4个对象包含在System.Data.Odbc命名控件中,需要将这个命名空间引入到文件中。 • 通过ODBC建立的数据源都可以通过ODBC.NET数据提供程序访问。
DataSet简介 • ADO.NET的核心组件是DataSet,内部用XML描述数据,具有平台无关性。DataSet中常用的对象是DataTable和DataRow等等。 • DataSet通过DataAdapter对象从数据源得到数据,DataAdapter是连接DataSet和数据库的一个桥梁,因此命名为:“数据适配器”。
SQL语言概述 • SQL(Structured Query Language)是关系型数据库的标准语言,是由国际标准组织提出的,各种关系型数据库都支持SQL指令,SQL Server在基本的SQL基础上进行了扩充,SQL语句有如下的两大特点: • (1)SQL是一种类似于英语的语言,很容易理解和书写。 • (2)SQL语言是非过程化的语言(第四代语言)。SQL语言包括DDL(Data Definition Language:数据定义语言),DML(Data Manipulation Language:数据操作语言)和DCL(Data Control Language:数据控制语言)等等。
基本SQL语句 • 基本的SQL语句包括DQL和DML。也就是对数据库最常用的四大基本操作:查询(Select)、插入(Insert)、更新(Update)和删除(Delete)。 • 1. 基本句型一:(最简单的SELECT语句) • SELECT 字段名 FROM 数据表 • 例1. SELECT * FROM grade • 功能说明:将grade表中的所有字段取出来。 • 例2. SELECT 学号,姓名 FROM grade • 功能说明:将grade表中学号和姓名字段取出来。 • 例3. SELECT学号,姓名,语文+数学+英语 as 总成绩 FROM grade • 功能说明:将grade表中的学号和姓名取出来,并将语文、数学和英语成绩相加产生虚拟的总成绩。
基本句型二 • 2. 基本句型二:(使用条件查询) • SELECT字段名 FROM数据表 WHERE 筛选条件 • 测试句型如下。 • 例1. SELECT * FROM grade WHERE数学>60 • 功能说明:把所有数学成绩大于60分的记录选出来。 • 例2. SELECT * FROM grade WHERE数学=300 or 语文=300 • 功能说明:把数学成绩等于300分或者语文成绩等于300分的人选出来。 • 例3. Like子句基本格式一:“_”匹配。 • 功能说明:每个下划线匹配一个任意字符,注意只匹配一个字符。比如:姓名 like '_敏',匹配姓名以“敏”字结尾且字数等于二的所有数据记录,如:“张敏”。 • 例4. Like子句基本格式二:“%”匹配。 • 比如:姓名 Like '%敏%',匹配姓名中出现“敏”的所有数据记录,如:“周惠敏”,“于敏”、“敏大”、“敏二”等。比如要在数据库中查询姓江的人,只要利用一条SQL语句就可以了,SELECT * FROM 数据库表 WHERE 姓名 Like '江%'。
基本句型三 • 3. 基本句型三:(进行排序) • SELECT字段名 FROM 数据表 ORDER BY 字段名 • 测试句型如下。 • (1)SELECT * FROM grade ORDER BY数学 注:从低到高排序 • 功能说明:从grade表中取出所有字段,并按数学成绩排序。 • (2)SELECT * FROM grade ORDER BY数学,语文 • 功能说明:从grade表中取出所有字段,并按数学成绩排序,如果数学成绩相同则按照语文成绩排序。 • (3)SELECT * FROM grade ORDER BY数学 desc 注:从高到低排序 • 功能说明:从grade表中取出所有字段,并按数学成绩倒序。 • (4)SELECT top 5 * FROM grade • 功能说明:从grade表中取出前五条记录的所有字段。
DML的基本格式 • DML的基本格式 • (1)DELETE指令:删除数据记录。 • 基本语法:DELETE FROM 数据表 WHERE 条件 • 例:DELETE from grade WHERE数学=0 • 功能说明:删除所有数学成绩为零的记录,如果没有WHERE子句,则删除所有记录。 • (2)UPDATE指令:更新数据记录。 • 基本语法:UPDATE 数据表 SET 字段值=新值 WHERE条件 • 例1:UPDATE grade SET 数学=数学+10 说明:将grade表中所有人的成绩加10分 • 例2:UPDATE grade SET 数学=100 WHERE 姓名 like '%敏%' • 功能说明:将姓名中含有敏的人的数学成绩更新为100分 • (3)INSERT INTO指令:添加数据记录。 • 基本格式1:INSERT INTO 数据表VALUES (字段新值) • 基本格式2:INSERT INTO 数据表(字段一,字段二,……) VALUES (字段新值)
聚合函数 • 聚合函数在信息管理系统经常使用,功能是做一些基本的统计和计算。 • 聚合函数有5个,分别是SUM函数、AVG函数、COUNT函数、MAX函数和MIN函数。
SUN函数 • (1)SUN函数,功能是算出某个字段的总值。 • 例. SELECT SUM(数学) As Total FROM grade • 功能说明:求出所有学生数学成绩总和,这个数值的列名为Total。在SQL输入窗口中输入, • (2)AVG函数,功能是算出某个字段的平均值。 • 例. SELECT AVG(数学) As Average FROM grade • (3)COUNT函数,功能是算出返回记录的行数。 • 例. SELECT COUNT(*) As Counts FROM grade • 功能说明:求出满足条件的记录总数。
(4)MAX函数,功能是算出某个字段的最大值。(4)MAX函数,功能是算出某个字段的最大值。 • 例. SELECT MAX(数学) As First FROM grade • 功能说明:求出所有学生数学成绩的最高分,这个数值的列名为First。 • (5)MIN函数,功能是算出某个字段的总值。 • 例. SELECT MIN(数学) As Last FROM grade • 功能说明:求出所有学生数学成绩的最低分,这个数值的列名为Last。
分组查询 • 计算所有男生的数学平均成绩,有两种方法: • (1)SELECT 性别, AVG(数学) as 平均分 FROM grade GROUP BY 性别 HAVING 性别='男' • (2)SELECT 性别, AVG(数学) as 平均分 FROM grade WHERE 性别='男' GROUP BY 性别
分组查询 • 在使用分组查询的时候,有4点需要注意。 • (1)WHERE子句必须放在GROUP BY子句之前。 • (2)HAVING子句中只能包含分组字段或者聚合函数。 • (3)SELECT语句选择的列只能是分组字段或者聚合函数。 • (4)HAVING必须放在GROUP BY子句之后。
交叉查询 • 考虑3个表:学生表(Student)、课程表(Course)和选课表(SC)表的关系如图7-16所示。 • 其中: • (1)学生表中的sno表示学生学号,sname表示学生姓名。 • (2)课程表中cno表示课程的编号,cname表示课程的名称。 • (3)选课表中的sno表示学生学号,cno表示课程编号。
查找选择课程为“软件工程”的所有同学姓名?可以利用如下的SQL语句。查找选择课程为“软件工程”的所有同学姓名?可以利用如下的SQL语句。 • SELECT b.sname FROM sc a, student b, course c • WHERE a.cno=c.cno • AND a.sno=b.sno and c.cname='软件工程‘ • 其中“sc a”表示给表sc起个别名为a,同样“student b”是给student表起个别名b。该查询实现了三个表之间的交叉查询。
Connection对象 案例名称:使用Connection对象 程序名称:6-01.aspx <% @ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e) { OleDbConnection Conn=new OleDbConnection(); Conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb"); Conn.Open(); Message.Text=Conn.State.ToString(); Conn.Close(); } </script> <asp:Label id="Message" runat="server" />
使用Connection对象的构造函数 案例名称:使用Connection对象的构造函数 程序名称:6-02.aspx <% @ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e) { OleDbConnection Conn; Conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb")); Conn.Open(); Message.Text=Conn.State.ToString(); Conn.Close(); } </script> <asp:Label id="Message" runat="server" />
使用Connection对象连接SQL Server数据库 案例名称:使用Connection对象连接SQL Server数据库 程序名称:6-03.aspx <% @ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { SqlConnection Conn; Conn=new SqlConnection("server=localhost;database=pubs;uid=sa;pwd=''"); Conn.Open(); Message.Text=Conn.State.ToString(); Conn.Close(); } </script> <asp:Label id="Message" runat="server" />
Command对象 • 建立数据连接以后,利用Command对象来执行命令并从数据源返回结果。 • Command对象常用的构造函数包括两个参数,1个是要执行的SQL语句,另一个是已经建立的Connnection对象,基本语法是: • OleDbCommand Comm=new OleDbCommand("select * from grade",Conn);
ExecuteReader方法 案例名称:使用ExecuteRader方法 程序名称:6-04.aspx <% @ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { OleDbConnection Conn=new OleDbConnection(); Conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb"); Conn.Open(); OleDbCommand Comm=new OleDbCommand("select * from grade",Conn); OleDbDataReader dr=Comm.ExecuteReader(); dg.DataSource=dr; dg.DataBind(); Conn.Close(); } </script> <asp:DataGrid id="dg" runat="server" />
案例名称:使用Like子句实现模糊查询 程序名称:6-05.aspx <% @ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script runat="server"> void submit_Click(Object sender,EventArgs e) { OleDbConnection Conn=new OleDbConnection(); Conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb"); Conn.Open(); string sql="select * from grade"; if (mytext.Text!="") sql="select * from grade where 姓名 like '%"+mytext.Text+"%'"; Message.Text=sql; OleDbCommand Comm=new OleDbCommand(sql,Conn); OleDbDataReader dr=Comm.ExecuteReader(); dg.DataSource=dr; dg.DataBind(); Conn.Close(); } </script> 请输入被查询的人名关键字<br> <form name="myform" runat="server"> <asp:TextBox id="mytext" size="50" runat="server"/><br> <asp:Button id="submit" onClick=submit_Click runat="server" Text="查询"> </asp:Button><br> <asp:label id="Message" runat="server"/><br> <asp:DataGrid id="dg" runat="server" /> </form>
程序中最关键的是如何将变量加到SQL语句中去。“SQL = ”Select * from grade where 姓名 like ‘%“ + str + ”%’“”语句中str是变量,要得到正确的格式只要按照下面的两个步骤进行操作。 • (1)写出正确的SQL语句,SQL =" Select * from grade where 姓名 like '%敏%'",因为姓名是文本型变量,所以必须加上单引号,在SQL语句中,用单引号表示字符型变量。 • (2)确定要替换的变量,这里是要将“敏”替换成变量Key。替换的规则是:删除“敏”字,在原字符串“敏”的位置,首先加上两个双引号,然后在两个双引号之间加上两个加号,最后将变量加到两个加号中间。
ExecuteScalar方法 案例名称:使用ExecuteScalar方法 程序名称:6-06.aspx <% @ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { OleDbConnection Conn=new OleDbConnection(); Conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb"); Conn.Open(); String strSQL="select avg(数学) from grade"; OleDbCommand Comm=new OleDbCommand(strSQL,Conn); Double d=(Double)Comm.ExecuteScalar(); Message.Text="所有人数学的平均成绩为"+d.ToString()+"分"; Conn.Close(); } </script> <asp:Label id="Message" runat="server" />
ExecuteNonQuery方法 案例名称:使用ExecuteNonQuery方法执行Insert语句 程序名称:6-07.aspx <% @ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { OleDbConnection Conn=new OleDbConnection(); Conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb"); Conn.Open(); String strSQL="insert into grade (学号,姓名,数学) "+ "values (99,'小张',100)"; OleDbCommand Comm=new OleDbCommand(strSQL,Conn); Comm.ExecuteNonQuery(); Conn.Close(); Response.Write("操作成功!"); } </script>
案例名称:使用事务的基本格式 程序名称:6-08.aspx <% @ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { OleDbConnection Conn=new OleDbConnection(); Conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb"); Conn.Open(); OleDbCommand Comm = new OleDbCommand(); OleDbTransaction Trans; Trans = Conn.BeginTransaction(); Comm.Connection = Conn; Comm.Transaction = Trans; try { Comm.CommandText = "UPDATE grade SET 数学=100 WHERE 姓名 LIKE '%周%'"; Comm.ExecuteNonQuery(); Comm.CommandText = "UPDATE grade SET 数学=60 WHERE 姓名 LIKE '%张%'"; Comm.ExecuteNonQuery(); Trans.Commit(); Response.Write("事务执行成功!"); } catch(Exception ex) { Trans.Rollback(); Response.Write("出现错误,事务已经回滚!"); } finally { Conn.Close(); } } </script> ADO.NET事务处理
DataReader对象 • 取DataReader对象的数据,有两种方法: • 1、通过和DataGrid等数据控件绑定,直接输出,使用方法如程序6-4.aspx。 • 2、另一种方法是利用循环将其数据取出
案例名称:使用DataReader对象输出数据 程序名称:6-09.aspx <% @ Page Language="C#" %> <%@Import Namespace="System.Data"%> <%@Import Namespace="System.Data.OleDb"%> <Script runat="server"> void Page_Load(Object Src, EventArgs E) { OleDbConnection Conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb")); Conn.Open(); String strSQL="select * from grade"; OleDbCommand Comm=new OleDbCommand(strSQL,Conn); OleDbDataReader dr=Comm.ExecuteReader(); string html="<Table border=1>"; html+="<TR>"; html+="<TD><B>学号</B></TD>"; html+="<TD><B>姓名</B></TD>"; html+="<TD><B>数学</B></TD>"; html+="</TR>"; try{//读出每一条记录 while(dr.Read()) { html+="<TR>"; html+="<TD>" + dr["学号"].ToString() + "</TD>"; html+="<TD>" + dr["姓名"].ToString() + "</TD>"; html+="<TD>" + dr["数学"].ToString() + "</TD>"; html+="</TR>"; } html+="</Table>"; } finally{//关闭链接 dr.Close(); Conn.Close(); } Response.Write(html); } </Script>
DataAdapter对象 案例名称:使用DataAdapter对象构造方法执行 程序名称:6-10.aspx <% @ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script runat="server"> protected void Page_Load(Object sender, EventArgs e) { OleDbConnection Conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb")); string sql="select * from grade"; Conn.Open(); OleDbDataAdapter da = new OleDbDataAdapter(sql, Conn);//执行SQL DataSet ds = new DataSet(); da.Fill(ds, "grade"); dg.DataSource=ds.Tables["grade"].DefaultView; dg.DataBind(); } </script> <ASP:DataGrid id="dg" runat="server" />
使用DataAdapter对象的SelectCommand属性 案例名称:使用DataAdapter对象的SelectCommand属性 程序名称:6-11.aspx <% @ Page Language="C#" %> <%@Import Namespace="System.Data"%> <%@Import Namespace="System.Data.OleDb"%> <Script language="C#" runat="server"> void Page_Load(Object Src, EventArgs E) { OleDbConnection Conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb")); string strSQL="select * from grade"; OleDbCommand Comm=new OleDbCommand(strSQL,Conn); OleDbDataAdapter da=new OleDbDataAdapter(); da.SelectCommand=Comm; Conn.Open(); DataSet ds = new DataSet(); da.Fill(ds,"grade"); dg.DataSource=ds.Tables["grade"].DefaultView; dg.DataBind(); Conn.Close(); } </script> <ASP:DataGrid id="dg" runat="server"/>
案例名称:使用DataAdapter对象的InsertCommand属性 程序名称:6-12.aspx <%@ Page Language="C#" %> <%@Import Namespace="System.Data"%> <%@Import Namespace="System.Data.OleDb"%> <Script runat="server"> void Page_Load(Object Src, EventArgs E) { OleDbConnection Conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb")); string strInsertSQL = "INSERT INTO grade(学号,姓名,数学) VALUES(111,'盖茨',59)"; string strSelectSQL = "SELECT * FROM grade WHERE 学号=111"; string strUpdateSQL = "UPDATE grade SET 数学=60 WHERE 学号=111"; // 创建Command对象 OleDbCommand InsertComm = new OleDbCommand(strInsertSQL,Conn); OleDbCommand SelectComm = new OleDbCommand(strSelectSQL,Conn); OleDbCommand UpdateComm = new OleDbCommand(strUpdateSQL,Conn); // 创建DataAdapter对象da OleDbDataAdapter da=new OleDbDataAdapter(); Conn.Open(); da.SelectCommand = SelectComm; da.UpdateCommand = UpdateComm; da.InsertCommand = InsertComm; // 创建并填充DataSet DataSet ds = new DataSet(); da.Fill(ds,"grade1"); da.InsertCommand.ExecuteNonQuery(); da.Fill(ds,"grade2"); da.UpdateCommand.ExecuteNonQuery(); da.Fill(ds,"grade3"); // 将DataSet绑定到DataGrid控件 dg1.DataSource=ds.Tables["grade1"].DefaultView; dg2.DataSource=ds.Tables["grade2"].DefaultView; dg3.DataSource=ds.Tables["grade3"].DefaultView; dg1.DataBind(); dg2.DataBind(); dg3.DataBind(); // 关闭连接 Conn.Close(); } </script> DataGrid1:<ASP:DataGrid id="dg1" runat="server"/><BR> DataGrid2:<ASP:DataGrid id="dg2" runat="server"/><BR> DataGrid3:<ASP:DataGrid id="dg3" runat="server"/>
DataSet对象 • DataSet封装在命名空间“Syste.Data”中。DataSet中可以包含任意数量的DataTable(数据表),且每个DataTable对应一个数据库中的数据表和视图。 • 通过DataAdapter的Fill方法,将表内容填充到DataSet对象中,而且可以填充多个表。利用别名来区分。比如“da.Fill(ds,"grade1");”的功能是将da对象中的数据填充到ds对象中,并起别名“grade1”,程序6-12.aspx说明了Fill方法的使用。
案例名称:自动生成DataSet对象 程序名称:6-13.aspx <%@ Page Language="C#" %> <%@ Import namespace="System.Data" %> <script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e){ DataSet myds = new DataSet(); DataTable mydt = new DataTable("Squares"); DataRow mydr; mydt.Columns.Add(new DataColumn("数字",typeof(Int32))); mydt.Columns.Add(new DataColumn("平方",typeof(Int32))); for (int i = 0; i < 10; i++) { mydr = mydt.NewRow(); mydr[0] = i; mydr[1] = i * i; mydt.Rows.Add(mydr); } myds.Tables.Add(mydt); dg.DataSource = myds.Tables["Squares"].DefaultView; dg.DataBind();} </script> <asp:DataGrid id="dg" runat= "server"/>
操作DataSet对象 案例名称:操作DataSet对象 程序名称:6-14.aspx <%@ Page Language="C#" %> <%@Import Namespace="System.Data"%> <%@Import Namespace="System.Data.OleDb"%> <Script runat="server"> void Page_Load(Object Src, EventArgs E) { OleDbConnection Conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb")); Conn.Open(); string strSQL="select * from grade;"; OleDbDataAdapter da=new OleDbDataAdapter(strSQL, Conn); DataSet ds = new DataSet(); da.Fill(ds,"grade"); DataTable dt = ds.Tables["grade"]; DataRow row = dt.NewRow(); row["学号"] = "199"; row["姓名"] = "小布什"; row["数学"] = 58; dt.Rows.Add(row); OleDbCommandBuilder cb = new OleDbCommandBuilder(da); da.Update(ds,"grade"); dg.DataSource = ds.Tables["grade"].DefaultView; dg.DataBind(); Conn.Close(); } </script> <ASP:DataGrid id="dg" runat="server"/>
DataView对象 案例名称:使用DataView对象 程序名称:6-15.aspx <%@ Page Language="C#" %> <%@Import Namespace="System.Data"%> <%@Import Namespace="System.Data.OleDb"%> <Script runat="server"> void Page_Load(Object Src, EventArgs E) { OleDbConnection Conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb")); String strSQL = "select * from grade"; OleDbCommand Comm = new OleDbCommand(strSQL,Conn); OleDbDataAdapter da = new OleDbDataAdapter(); da.SelectCommand = Comm; Conn.Open(); DataSet ds = new DataSet(); da.Fill(ds,"grade"); DataView dv = new DataView(ds.Tables["grade"]); dv.RowFilter = " 数学 > 60"; dv.Sort = "学号 desc, 数学 DESC"; Response.Write("满足条件的记录有:" + dv.Count + "条"); dg.DataSource = dv; dg.DataBind(); Conn.Close(); } </script> <ASP:DataGrid id="dg" runat="server"/>
使用DataView对象进行简单查询 案例名称:使用DataView对象进行简单查询 程序名称:6-16.aspx <%@ Page Language="C#" %> <%@Import Namespace="System.Data"%> <%@Import Namespace="System.Data.OleDb"%> <Script runat="server"> void Page_Load(Object Src, EventArgs E) { OleDbConnection Conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("person.mdb")); String strSQL = "select * from grade"; OleDbCommand Comm = new OleDbCommand(strSQL,Conn); OleDbDataAdapter da = new OleDbDataAdapter(); da.SelectCommand = Comm; Conn.Open(); DataSet ds = new DataSet(); da.Fill(ds,"grade"); DataView dv = new DataView(ds.Tables["grade"],"", "姓名", DataViewRowState.CurrentRows); int rowIndex = dv.Find("小张"); if (rowIndex == -1) Response.Write("没有找到!"); else Response.Write(dv[rowIndex]["姓名"].ToString() + dv[rowIndex]["数学"].ToString()); //dg.DataSource = dv; dg.DataBind(); Conn.Close(); } </script> <ASP:DataGrid id="dg" runat="server"/>
数据控件 • 数据控件属于Web服务器端控件,数据控件包括三个控件: • Repeater控件,DataList控件和DataGrid控件。 • 其中最常用的数据控件是DataGrid控件,也是功能最强大的数据控件。
Repeater数据控件 • Repeater控件的主要功能是以更自由的方式来控制数据,用非表格的形式来展现数据。Repeater控件最关键的部分是摸板,允许用户定义5种摸板: • ItemTemplate,数据摸板,这是Repeater控件必须的 • AlternatingItemTemplate,隔行数据模板,可选参数 • SeparatorTemplate,分割线模板,可选参数 • HeaderTemplate,抬头模板,可选参数 • FooterTemplate,结尾模板,可选参数
DataList数据控件 • DataList数据控件在Repeater数据控件基础上进行了扩展,除了含有Repeater的功能外,还可以设置单行笔数等等。 • DataList控件和Repeater控件数据输出的格式都取决于样板的定义,不同点是:DataList在浏览器中会以表格的形式输出。
DataGrid数据控件 • DataGrid数据控件是这3个数据控件中最强大的一个。 • 使用DataGrid控件可以自动显示表的内容。 • 利用DataReader对象或者DataSet对象和DataGrid控件进行绑定,就可以进行数据输出。
小结 • 本章介绍了框架类中ADO.NET的结构,理解ADO.NET的组成以及4种.NET数据提供程序的用途用法。 • 重点掌握SQL语句的分类以及使用、Connection对象、如何使用Command对象执行各种SQL语句,如何利用ADO.NET实现事务处理。 • 熟悉DataReader对象、DataAdapter对象的概念以及使用方法。熟练掌握DataSet对象,了解Repeater数据控件和DataList控件的使用,掌握DataGrid控件的使用。
本章习题 • 6-1 图示ADO.NET的结构。 • 6-2 简述.NET提供的4种数据提供程序,以及使用范围。 • 6-3 列举4个SQL聚合函数,并阐述其功能,以及如何利用ADO.NET执行? • 6-4 如何理解分组查询,使用分组查询的时候应该注意什么? • 6-5 如何利用ADO.NET实现事务?事务有什么特点? • 6-6 DataSet对象是用什么描述的,如何将数据填充到DataSet对象中? • 6-7 将程序6-10、6-11、6-12改编成操作SQL Server数据库的程序。(上机完成) • 6-8 如何实现分页显示?编写程序实现数据库分页,要求每页显示8条记录。(上机完成)。 • 6-9 编写程序,利用DataGrid控件实现数据库表的动态添加、删除和修改。(上机完成)。