680 likes | 862 Views
第七章. 数据库编程 - 操作数据. 目标. 理解并使用数据集对象 使用 DataAdapter 对象 使用 DataReader 对象 了解 DataGridView 控件常见的属性和方法 掌握 DataGrid View 的数据绑定 掌握在 DataGridView 控件中插入、更新和删除数据 掌握定制 DataGridView 界面. 为什么使用 DataSet 对象. 大批量的查询、修改数据怎么办? 想在断开数据库连接的情况下操所数据怎么办?. 使用 DataSet 对象. DataSet. 应用程序 大量的数据
E N D
第七章 数据库编程-操作数据
目标 • 理解并使用数据集对象 • 使用 DataAdapter 对象 • 使用DataReader对象 • 了解 DataGridView 控件常见的属性和方法 • 掌握 DataGridView 的数据绑定 • 掌握在 DataGridView 控件中插入、更新和删除数据 • 掌握定制DataGridView界面
为什么使用 DataSet 对象 • 大批量的查询、修改数据怎么办? • 想在断开数据库连接的情况下操所数据怎么办? 使用 DataSet 对象 DataSet 应用程序 大量的数据 来自多个数据源 数 据 库
什么是 DataSet 对象 • DataSet 数据集 • 简单理解为一个临时数据库 • 将数据源的数据保存在内存中 • 独立于任何数据库 驻留于内存, 临时存储数据 数据源 应用程序 DataSet 类似 工厂的仓库 车间的 临时仓库 生产线
DataColumnCollection DataRowCollection DataTableCollection DataSet 的结构2-1 DataSet 的基本结构 数据集 DataSet 数据表的集合 数据表 数据列的集合 DataTable 数据行的集合 数据行 DataRow 数据列 DataColumn
DataSet 的结构2-2 DataTableCollection 数据表集合 GradeTable DataTable 数据表 ClassTable StudentTable DataColumnCollection 数据列集合 DataColumn 数据列 DataRow 数据行 DataRowCollection 数据行集合
数据集的工作原理 请求数据 传递数据 发送数据 数据集 修改数据集 提交修改后的数据 客户端
如何创建 DataSet 对象 • 创建一个 DataSet • 可以指定一个数据集的名称 • 如果不指定名称,则默认被设为"NewDataSet" 可选的 DataSet 数据集对象= new DataSet("数据集的名称字符串"); DataSet dataSet = new DataSet(); DataSet dataSet = new DataSet(“MySchool”); //MySchool为数据集名称
数据集的类型 使用类型化数据集访问列 使用非类型化数据集访问列 数据集的类型 string studentName; studentName = dsStudents.Stu[0].StuName; • string studentName; • studentName = • dsStudents.Tables[“Stu"].Rows[0][“StuName"]; 类型化数据集 非类型化数据集 从 dsStudents 数据集的 Stu 表中第一个记录返回 StuName列,然后将其存储在 studentName 字符串变量中 使用 Tables集合返回 StuName列 它是一个生成类,继承了基类 DataSet的所有方法、事件和属性 表和列只能以集合的形式公开,而不能用于借助 XML结构文件派生新类
使用 C# 代码创建数据集 • 数据集实例是由 DataSet 构造函数创建的 • 数据集的名称是可选的,不需要指定 • 如果没有指定名称,则以默认名称 NewDataSet创建数据集 DataSet stuDS = new DataSet(“StudentDetails");
DataTable、DataColumn和DataRow 5-1 • 数据集中的数据以 DataTable对象的形式存储 • DataTable类属于 System.Data命名空间
DataTable、DataColumn和DataRow 5-3 创建 DataTable对象的实例 DataTable objStuTable = new DataTable("Student"); DataSet stuDS = new DataSet(); DataTable objStuTable = stuDS.Tables.Add("Student"); 创建 DataTable的实例,然后将其添加到数据集的 Tables集合中
DataTable、DataColumn和DataRow 5-4 • DataColumn对象定义 DataTable的列 • DataTable的Columns属性含有对 DataColumn对象的引用 使用多个 DataColumn对象创建 DataTable DataTable objStuTable = new DataTable("Student"); DataColumn objStuNumber = objStuTable.Columns.Add (" StuNo ",typeof(Int32)); objStuNumber.AllowDBNull = false; objStuNumber.DefaultValue = 12; objStuTable.Columns.Add("StuName",typeof(string)); objStuTable.Columns.Add("StuMarks",typeof(Double));
DataTable、DataColumn和DataRow5-5 • DataRow对象表示 DataTable中的实际数据 //定义表结构,为Student表添加学号、姓名、分数三列 DataTable objStuTable = new DataTable("Student"); DataColumn objStuNumber = new DataColumn(); objStuNumber.DataType = objStuTable.Columns.Add (" StuNo ",typeof(string)); objStuNumber.AllowDBNull = false; objStuNumber.DefaultValue = 12; objStuTable.Columns.Add("StuName",typeof(string)); objStuTable.Columns.Add("StuMarks",typeof(Double)); //向表中填充数据 DataRow objStuRow; objStuRow= objStuTable.NewRow(); objStuRow["StuNo"]=99; objStuRow[“StuName”]=“王鹰"; objStuRow["StuMarks"]=95; objStuTable.Rows.Add(objStuRow); 在 DataTable对象中新建 DataRow
定义主键 • 表中的主键用于对记录进行唯一标识 • DataTable的 PrimaryKey属性接受含有一个或多个 DataColumn对象的数组 objStuTable.PrimaryKey = new DataColumn[]{objStuTable.Columns["StuNo"]}; 设置单个列为 DataTable的主键 objStuTable.PrimaryKey = new DataColumn[] { objStuTable.Columns["StuNo"], objStuTable.Columns["StuName"] }; 为 DataTable对象设置复合主键
DataTable的约束 是对表中数据施加的限制或规则集 决定表中可以存储的数据 约束的类型 Constraint ForeignKeyConstraint UniqueConstraint 用于维护数据的正确性和有效性
DataView DataView objStuView = new DataView(objStuTable); objStuView.RowFilter = "StuMarks > 60"; for(int i =0; i< objStuView.Count; i++) { MessageBox.Show(objStuView[i]["StuNo"].ToString()); } 用作 DataTable中存储的数据的表示层 数据绑定 提供对 DataTable进行排序、筛选和搜索的自定义视图 DataView 是为了在控件上显示数据库表中存储的数据,而将应用程序的控件与数据表的行进行绑定的过程 允许 WinForms 控件进行数据绑定 可用于查看 DataTable 中存储的数据的子集 创建 DataView并对该视图应用某种筛选器
知识点小结 • 使用DataSet的优点及使用场合 • DataSet的层次结构 • 操纵DataSet中指定行中特定列的值 • 在程序中向DataSet中动态添加表、字段、值、约束 • 利用DataView筛选数据
为什么使用 DataAdapter • 如何将数据库的数据放在 DataSet 中? DataAdapter 数 据 库 DataSet 数据集 DataAdapter 数据适配器 数据库 DataSet 数据集 Connection 数据库连接
DataAdapter 对象 • 不同命名空间的 DataAdapter 对象
如何填充数据集 • 使用 DataAdapter 对象填充数据集 DataAdapter 的 Fill() 方法 DataSet 数据集 数 据 库 Connection 使用Connection 连接数据源 使用Fill() 方法填充 DataSet 中的表
填充数据集 1 创建 SqlDataAdapter 对象 SqlDataAdapter 对象名= new SqlDataAdapter(查询用sql语句, 数据库连接); 2 填充 DataSet DataAdapter对象. Fill(数据集对象, "数据表名称字符串");
如何保存 DataSet 中的数据 • 把数据集中修改过的数据提交到数据源 DataSet 数据集 数 据 库 Connection DataAdapter 的 Update() 方法 dataAdapter.Update(dataSet,"Teacher"); 调用前,要先设置更新需要的相关命令 可以使用 SqlCommandBuilder 对象
SqlCommandBuilder 对象 • 利用 SqlCommandBuilder 对象能够自动生成: • INSERT 命令 • UPDATE 命令 • DELETE 命令 SqlCommandBuilder builder = new SqlCommandBuilder(已创建的DataAdapter对象);
保存 DataSet 中的数据 • 步骤: 1 自动生成用于更新的相关命令 SqlCommandBuilder builder = new SqlCommandBuilder(已创建的DataAdapter对象); 2 将 DataSet 的数据提交到数据源 DataAdapter对象. Update(数据集对象, "数据表名称字符串"); SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter); dataAdapter.Update(dataSet,“Student");
DataAdapter 对象小结 • DataAdapter 的主要属性和方法
OLEDBDataAdapter • 用于访问任何由 OleDb提供程序公开的数据源 • 用作数据集和数据源之间的桥梁,以便检索和存储数据 • 与 OleDbConnection和 OleDbCommand一起使用以提高性能 DataAdapter类的属性和方法 • OleDbConnection objOleConn = new OleDbConnection(); • objOleConnection.ConnString = • "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = "+ • "D:\\Students.mdb"; • objOleConn.Open(); • string selstr ="SELECT * from Student"; • DataSet objDS = new DataSet(); • OleDbDataAdapter objOleAdapter = new OleDbDataAdapter(); • objOleAdapter.SelectCommand = new • OleDbCommand(selstr,objOleConn); • objOleAdapter.Fill(objDS,"Student"); 传递给 OleDbAdapter 对象 将数据填充到数据集中
SQLDataAdapter • 它设计为使用 Microsoft SQL Server 7 或更高版本提供最佳通信 • 该适配器在数据集和 Microsoft SQL Server之间起桥梁作用,提供用于保存和检索数据的接口 • 与 SqlConnection和 SqlCommand相互配合使用 SqlConnection objSqlConn = new SqlConnection ("SERVER=MYSERVER;database=Students;uid=sa; password=playware"); SqlDataAdapter objSqlAdapter = new SqlDataAdapter("SELECT * from Student",objSqlConn); objSqlConn.Open(); DataSet objDS = new DataSet(); objSqlAdapter.Fill(objDS,"Student"); 创建与 SQL Server 数据库的连接, 并用相应的值填充数据集
小结 • DataAdapter 的作用是什么? 使用什么方法填充 DataSet ? 使用什么方法将 DataSet 中数据提交到数据库?
为什么使用 DataReader • 怎样读取数据库的数据? 使用 DataReader 对象 应用程序 DataReader 数 据 库 毛毛 姓名: 浙江水专 学校: 毛毛,浙江水专,优秀 成绩: 优秀
DataReader 对象 • 每次读取一行数据
使用 DataReader 查询数据 添加年级组合框中的年级名称 处理窗体 Load 事件 使用 DataReader 读取年级名称
示例1 代码分析 • 关键代码回顾: // 执行查询 SqlDataReader dataReader = command.ExecuteReader(); string gradeName = ""; // 年级名称 // 循环读出所有的年级名,并添加到年级列表框中 while (dataReader.Read()) { gradeName = (string)dataReader[0]; cboGrade.Items.Add(gradeName); } dataReader.Close(); 循环读取数据行 添加到组合框中
DataReader 的主要成员 • DataReader 的主要成员:
DataReader 使用步骤小结 • 使用 DataReader 检索数据的步骤: 1、创建 Command 对象 2、调用 ExecuteReader()创建 DataReader 对象 3、使用 DataReader 的 Read()方法逐行读取数据 4、读取某列的数据,(type)dataReader[ ] 5、关闭DataReader 对象 获取某列的值: 方法一:指定列的索引,从0开始 方法二:指定列名 注意:DataReader 使用后必须关闭
小结 • 编写控制台程序,从Student表中,读取出所有姓“李”学员的姓名 string sql = "SELECT StudentName FROM Student WHERE StudentName LIKE '李%'"; SqlCommand command = new SqlCommand(sql, connection); connection.Open(); SqlDataReader dataReader = command.ExecuteReader(); Console.WriteLine("查询结果:"); while (dataReader.Read()) { Console.WriteLine((string)dataReader["StudentName"]); } dataReader.Close();
操作数据 • 如何对数据库的数据进行增删改? 使用 ExecuteNonQuery() 方法 应用程序 ExecuteNonQuery 数 据 库 毛毛 姓名: 浙江水专 学校: 毛毛,浙江水专,良好 成绩: 良好
操作数据示例 怎样新增学员用户? 处理“保存”按钮的 Click事件 使用 ExecuteNonQuery()方法向数据库增加记录
示例 2 代码分析 • 关键代码回顾: // 创建command对象 SqlCommand command = new SqlCommand(sql, DBHelper.connection); // 打开数据库连接 DBHelper.connection.Open(); // 执行命令 int result = command.ExecuteNonQuery(); …… 返回受影响记录的行数
ExecuteNonQuery()方法小结 • 该方法执行指定的 sql 语句 • 返回受影响的行数 • 使用 ExecuteNonQuery() 的步骤小结: • 1、创建 Connection 对象 • 2、定义sql 语句 • 3、创建 Command 对象 • 4、执行 ExecuteNonQuery() 方法 • 5、根据返回的结果进行处理
小结 • 向数据库中添加年级 • 假设数据库连接字符串已知为 connStr • 将添加年级名称部分的代码补充完整 string connStr = "…"; SqlConnection connection = new SqlConnection(connStr); // 插入记录用的SQL 语句 string sql = string.Format( "INSERT INTO Grade (GradeName) VALUES ('{0}')", txtGradeName.Text); // 创建Command 对象 SqlCommand command = new SqlCommand(sql, connection); // 打开数据库连接 connection.Open(); // 执行插入命令 int result = command.ExecuteNonQuery(); connection.Close(); // 关闭数据库连接 private void btnAdd_Click(object sender, EventArgs e) { string connStr = "……"; SqlConnection connection = new SqlConnection(connStr); // 向数据库中添加年级名称的代码 }
数 据 集 为什么使用 DataGridView • 怎样显示 DataSet 中的数据呢? 使用 DataGridView
DataGridView 控件 • DataGridView 控件 强大而灵活地显示数据 轻松定义控件外观 像 Excel 表格一样方便 一行代码实现数据绑定 可视化操作
使用 DataGridView 显示数据 • 示例1已经填充了 DataSet ,如何在窗体中显示教师信息? 使用 DataGridView 显示数据 指定 DataGridView 的数据源—— DataSource 属性
使用 DataGridView 显示数据 • 实现步骤: • 添加窗体的控件 • 设置 DataGridView 控件和其中各列的属性 • 设置 DataSource 属性,指定数据源 • dgvTeacher.DataSource = dataSet.Tables[“Teacher"];
DataGridView 控件重要属性 DataGridView 的重要属性 在其中编辑 DataGridView 列的属性
列的主要属性小结 DataGridView 中各列的主要属性
通过 DataGridView 修改数据 • 把修改过的教师信息保存到数据库 使用 DataAdapter 的 Update() 方法 注意:将 DataGridView 和相应列的 ReadOnly 属性设为 False
通过 DataGridView 修改数据 • 实现步骤: • 处理“保存修改”按钮的 Click 事件 • 编写事件处理程序 SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter); dataAdapter.Update(dataSet, "Teacher");