240 likes | 481 Views
第 11 章 使用 DataSet 访问数据库. 本章内容: DataSet 的基本构成,访问和填充 DataSet ,修改 DataSet 及数据更新。 本章重点: DataSet 的基本构成,常用子对象、属性和方法,使用 DataSet 与 DataAdapter 配合完成常规数据库操作。. 11.1 DataSet 的基本构成. 11.1.1 DataSet 、 DataAdapter 和数据源之间的关系. 11.1.2 DataSet 的组成结构和工作过程 1. DataSet 的组成结构. 11.1.3 DataSet 中的常用子对象.
E N D
第11章 使用DataSet访问数据库 本章内容:DataSet的基本构成,访问和填充DataSet,修改DataSet及数据更新。 本章重点:DataSet的基本构成,常用子对象、属性和方法,使用DataSet与DataAdapter配合完成常规数据库操作。
11.1 DataSet的基本构成 • 11.1.1 DataSet、DataAdapter和数据源之间的关系
11.1.2 DataSet的组成结构和工作过程 • 1. DataSet的组成结构
11.1.4 DataSet对象常用属性和方法 • 1. DataSet对象的常用属性 • 2. DataSet对象的常用方法
11.1.5 构建DataSet的方法 • 1. 通过DataAdapter的Fill()方法 • 2. 通过手工编程方式构建DataSet
(1)DataTable • DataTable是内存中的一个关系数据表,可以作为DataSet中的一个成员使用,也可以独立创建使用。要把DataTable作为DataSet中的一个成员使用,可按以下步骤操作。 • ① 创建一个空的数据集: • DataSet ds = new DataSet(); • ② 创建一个DataTable对象: • DataTable dt = new DataTable("表名"); • 在创建DataTable时,可以指定DataTable的表名。如果没有指定表名,则自动创建后缀从0开始递增的默认表名Table0、Table1、Table2等。
③ 把表添加到DataSet中: • ds.Tables.Add(表对象名); • ds.Tables.Add("表名"); • 如果添加的表名在DataSet中已经存在,则会引发异常。 • 上面创建的表没有表结构,要定义表结构,必须创建DataColumn对象,并把数据列添加到表的Columns[]集合中。在为表定义结构后,通过DataRow对象把数据行添加到表的Rows[]集合中。
(2)DataColumn • DataTable的结构是通过向DataTable中添加一个或多个DataColumn对象来实现的。DataColumn对象有一些属性用于对输入数据的限制,包括数据类型、数据长度、默认值等,常用属性见表11-4。
① 定义DataColumn有两种方法。 • 第一种方法:先创建空的DataColumn对象,然后设置该对象的属性。 • 例如,下面是创建StudentName(学生姓名)列的代码: • DataClumn dcStudentName=new DataColumn(); //创建StudentName列对象 • dcStudentName.ColumnName="StudentName"; //定义列名为StudentName • dcStudentName.DataType=System.Type.GetType("System.String"); //定义类型为String • dcStudentName.MaxLength=20; //定义列的最大字符数为20个字符
第二种方法:在创建DataColumn对象时提供列名和列的数据类型,然后再设置该对象的属性。第二种方法:在创建DataColumn对象时提供列名和列的数据类型,然后再设置该对象的属性。 • 下面也是创建StudentName列的代码: • DataColumn dcStudentName=new DataColumn("StudentName", typeof(string)); • dcStudentName. MaxLength=20; • ② 在表中添加列。 • dt.Columns.Add(列对象名); • ds.Tables["表名"].Column.Add("列名", 列类型);
(3)DataRow • 在DataTable中,用DataColumn定义好表结构后,可以通过DataRow把记录数据添加到DataTable中。 • 例如,下面代码把“黄颖”添加到用DataColumn定义好的DataTable中。 • DataRow drStudentInfo=dt.NewRow() • drStudentInfo["dcStudentName"]="黄颖";
11.2 访问和填充DataSet • 11.2.1 创建DataSet • 创建数据集对象的语法格式如下: • DataSet 数据集对象名 = new DataSet(); • 或 • DataSet 数据集对象名 = new DataSet("表名"); • 其中,前一个语法格式表示要先创建一个空数据集,以后再将已经建立的数据表(DataTable)添加进来;后一个语法格式是先建立数据表,然后建立包含该数据表的数据集。
11.2.2 填充DataSet • 所谓“填充”,是指将DataAdapter对象通过执行SQL语句从数据源得到的返回结果,使用DataAdapter对象的Fill方法传递给DataSet对象。其常用语法格式如下: • 数据适配器对象名.Fill(数据集对象名); • 或 • 数据适配器对象名.Fill(数据集对象名, "表名");
填充DataSet的一般方法和步骤如下。 • ① 使用Connection对象建立与数据库的连接: • SqlConnection conn = new SqlConnection(); //创建SQL Server连接对象 • 这里不需要建立Command对象。 • ② 创建DataAdapter对象: • SqlDataAdapter da = new SqlDataAdapter(); //创建空的DataAdapter对象 • ③ 创建从数据库查询数据用的Select SQL语句: • string SelectSql = "select * from StudentInfo";
④ 设置DataAdapter对象的SelectCommand属性,使用conn指定连接,执行SelectSql指定的SQL语句,从数据库中取出需要的数据。代码如下: • da.SelectCommand = new SqlCommand(SelectSql, conn); • ⑤ 创建一个空DataSet对象: • DataSet ds = new DataSet(); • ⑥ 使用DataAdapter对象的Fill方法填充DataSet: • da.Fill(ds); //将DataAdapter执行SQL语句返回的结果填充到DataSet对象 • ⑦ 为GridView控件设置数据源,并绑定,以便在GridView控件中显示DataSet中的数据。
【例11-1】使用DataSet浏览数据库。程序运行后能将SQL Server数据库StudentDB的StudentInfo表中所有记录显示到GridView控件中。 • protected void Page_Load(object sender, EventArgs e) • { • SqlConnection conn = new SqlConnection(); //创建SQL Server连接对象 • //为连接对象的连接字符串属性赋值 • //其中“MICROSOF-63A313\MSSQLSERVER2008”为SQL Server服务器计算机名称 • //使用时要更换为自己的计算机和数据库服务器名称。 • //注意,连接字符串中的“\”字符,在程序代码中需要转义,所以要写为“\\” • conn.ConnectionString="Data Source =MICROSOF-63A313\\MSSQLSERVER2008; • Initial Catalog=StudentDB; Integrated Security=True"; • SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象 • string SelectSql = "select * from StudentInfo"; //定义从数据库查询数据用的Select SQL语句 • da.SelectCommand = new SqlCommand(SelectSql, conn);//执行SelectSql指定的Select SQL语句 • DataSet ds = new DataSet(); //创建一个空DataSet对象 • da.Fill(ds); //将DataAdapter执行SQL语句返回的结果填充到DataSet对象中 • GridView1.DataSource = ds; //设置填充后的DataSet对象为GridView控件的数据源 • GridView1.DataBind(); • }
【例11-2】 • protected void Page_Load(object sender, EventArgs e) • { • SqlConnection conn = new SqlConnection(); //创建SQL Server连接对象 • //@符号的作用是忽略转义字符,所以后面字符串中写一个“\” • conn.ConnectionString=@"Data Source=MICROSOF-63A313\MSSQLSERVER2008; • Initial Catalog=StudentDB; Integrated Security=True"; • SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象 • string SelectSql = "select * from StudentInfo where Sex = '女';" + • "select * from StudentInfo where Email like '%163%'"; • //定义从数据库查询数据用的Select SQL语句,本例是两条Select语句 • da.SelectCommand = new SqlCommand(SelectSql, conn); //执行SQL语句并保存到da中 • DataSet ds = new DataSet(); //创建一个空DataSet对象 • da.Fill(ds); //把da中的数据填充到ds中,将生成两个表 • GridView1.Caption = "<b>性别为“女”的所有记录</b>"; • GridView1.DataSource = ds.Tables[0]; //使用第一个结果集为GridView1的数据源 • GridView1.DataBind(); //绑定数据源 • GridView2.Caption = "<b>电子邮箱地址中包含“163”的所有记录</b>"; • GridView2.DataSource = ds.Tables[1]; //使用第二个结果集为GridView2的数据源 • GridView2.DataBind(); //绑定数据源 • }
11.3 修改DataSet及数据更新 • 11.3.1 添加新记录 • 在用DataSet添加新记录时,需要自定义一个与要添加记录的数据表完全相同的DataTable,然后把DataTable添加到DataSet中。通过DataSet向数据表添加新记录的一般方法和步骤如下。 • ① 使用Connection对象建立与数据库的连接。 • ② 创建从数据库查询数据用的Select SQL语句。 • ③ 通过DataAdapter对象用Select SQL语句从数据库中取出需要的数据。 • ④ 使用SqlCommandBuilder对象为DataAdapter对象自动生成更新命令。 • ⑤ 创建DataSet对象。 • ⑥ 使用DataAdapter对象的Fill()方法填充DataSet。 • ⑦ 使用NewRow()方法在DataSet中填充的表对象中创建一个新行对象。 • ⑧ 为新行中各字段赋值。 • ⑨ 将新行对象添加到DataSet中填充的表对象中。 • ⑩ 调用DataAdapter对象的Update()方法将数据保存到数据库中。
【例11-3】使用DataSet向数据库中添加新记录(行)。【例11-3】使用DataSet向数据库中添加新记录(行)。 • 页面装入时在GridView控件中显示当前数据表中所有记录,代码如下: • protected void Page_Load(object sender, EventArgs e) • { • SqlConnection conn = new SqlConnection(); //创建SQL Server连接对象 • conn.ConnectionString=@"Data Source=服务器名;Initial Catalog=StudentDB; • Integrated Security=True"; • //把“服务器名”更改为自己的SQL Server服务器实例名 • SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象 • string SelectSql = "select * from StudentInfo"; • da.SelectCommand = new SqlCommand(SelectSql, conn); • DataSet ds = new DataSet(); //创建一个空DataSet对象 • da.Fill(ds,"studentInfo"); • GridView1.DataSource = ds; //设置填充后的DataSet对象为GridView控件的数据源 • GridView1.DataBind(); • }
单击“添加记录”按钮时执行的事件代码如下:单击“添加记录”按钮时执行的事件代码如下: • protected void AddRow_Click(object sender, EventArgs e) • { • SqlConnection conn = new SqlConnection(); //创建SQL Server连接对象 • conn.ConnectionString=@"Data Source=服务器名;Initial Catalog=StudentDB; • Integrated Security=True"; • //把“服务器名”更改为自己的SQL Server服务器实例名 • SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象 • string SelectSql = "select * from StudentInfo"; • da.SelectCommand = new SqlCommand(SelectSql, conn); • //自动生成单表,用于将对DataSet所做的更改与关联的SQL Server数据库的更改相协调 • SqlCommandBuilder scb = new SqlCommandBuilder(da); //为DataAdapter自动生成更新命令 • DataSet ds = new DataSet(); //创建一个空DataSet对象 • da.Fill(ds); • DataRow StudentNewRow = ds.Tables[0].NewRow();//在DataSet第一个表中创建一个新行对象 • StudentNewRow["StudentID"] = "200902602028"; //为新行的各字段赋值 • StudentNewRow["StudentName"] = "黄蓉"; • StudentNewRow["Sex"] = "女"; • StudentNewRow["DateOfBirth"] = "1991-09-28"; • StudentNewRow["Specialty"] = "网络技术"; • StudentNewRow["Email"] = "hy9109@126.com"; • ds.Tables[0].Rows.Add(StudentNewRow); //将新行对象添加到DataSet中填充的表对象中 • GridView1.DataSource = ds.Tables[0]; //在GridView中显示添加记录后的结果 • GridView1.DataBind(); • da.Update(ds); //将DataSet中数据变化提交到数据库(更新数据库) • }
11.3.2 修改数据库记录 • 【例11-4】通过DataSet对象更新数据表记录。 • 在例11-3创建的Web窗体中添加“更新记录”按钮,其单击事件代码如下: • protected void EditRow_Click(object sender, EventArgs e) • { • SqlConnection conn = new SqlConnection(); • conn.ConnectionString=@"Data Source=服务器名;Initial Catalog=StudentDB; • Integrated Security=True"; • //把“服务器名”更改为自己的SQL Server服务器实例名 • SqlDataAdapter da = new SqlDataAdapter(); • string SelectSql = "select * from StudentInfo"; • da.SelectCommand = new SqlCommand(SelectSql, conn); • SqlCommandBuilder scb = new SqlCommandBuilder(da); //为DataAdapter自动生成更新命令 • DataSet ds = new DataSet(); • da.Fill(ds); • //创建行对象,从表Tables[0]对象中得到要修改的行,修改第4行的记录 • DataRow MyRow = ds.Tables[0].Rows[3]; • MyRow["StudentID"] = "200902601100"; //为该行各字段赋以新值,如果学号重复,则出错 • MyRow["StudentName"] = "张无忌"; • GridView1.DataSource = ds.Tables[0]; //在GridView中显示添加记录后的结果 • GridView1.DataBind(); • da.Update(ds); //将DataSet中数据变化提交到数据库(更新数据库)中 • }
11.3.3 删除记录 • 【例11-5】通过DataSet对象删除数据表记录。 • 在例11-3创建的Web窗体中添加“删除记录”按钮,其单击事件代码如下: • protected void DelRecord_Click(object sender, EventArgs e) • { • SqlConnection conn = new SqlConnection(); • conn.ConnectionString=@"Data Source=服务器名;Initial Catalog=StudentDB; • Integrated Security=True"; • //把“服务器名”更改为自己的SQL Server服务器实例名 • SqlDataAdapter da = new SqlDataAdapter(); • string SelectSql = "select * from StudentInfo"; • da.SelectCommand = new SqlCommand(SelectSql, conn); • SqlCommandBuilder scb = new SqlCommandBuilder(da); //为DataAdapter自动生成更新命令 • DataSet ds = new DataSet(); • da.Fill(ds); • //创建行对象,指定要删除的行索引值(删除第1个记录) • DataRow DeleteRow = ds.Tables[0].Rows[0]; • DeleteRow.Delete(); //调用DataRow对象的Delete()方法,从DataSet填充的数据表中删除行 • GridView1.DataSource = ds.Tables[0]; //在GridView中显示删除记录后的结果 • GridView1.DataBind(); • da.Update(ds); • }
11.4 实训 • 实训目的 • 1)掌握配合使用DataSet和DataAdapter访问SQL Server数据库的基本方法(增、删、改、查)。 • 2)掌握DataSet.Tables子对象及DataRow对象在程序设计中的具体使用方法。 • 实训要求