300 likes | 404 Views
第 10 章 数据库开发技术. 王德俊 上海交通大学继续教育学院. 第 10 章 数据库开发技术. 10.1 数据库系统与ADO.NET概述 10.2 SQL语言简介 10.3 ADO.NET对象. 10.3 ADO.NET 对象. 10.3.1 Connection 对象 10.3.2 Command 对象 10.3.3 DataReader 对象 10.3.4 DataAdapter 对象 10.3.5 DataSet 对象. 10.3 ADO.NET 对象. 10.3.4 DataAdapter 对象.
E N D
第10章 数据库开发技术 王德俊 上海交通大学继续教育学院
第10章 数据库开发技术 10.1 数据库系统与ADO.NET概述 10.2 SQL语言简介 10.3 ADO.NET对象
10.3 ADO.NET对象 10.3.1 Connection对象 10.3.2 Command对象 10.3.3 DataReader对象 10.3.4 DataAdapter 对象 10.3.5 DataSet对象
10.3 ADO.NET对象 10.3.4 DataAdapter对象 • DataAdapter对象除了可以实现DataReader对象的功能以外,还可以执行对数据库的插入、更新和删除等操作,其功能要比DataReader对象的功能强得多(要与DataSet对象结合使用)。 • 但强功能的实现就意味着要付出更多的机器资源,因此,如果DataReader对象能完成的任务就不必使用DataAdapter对象。
10.3.4 DataAdapter对象 • 命名空间: System.Data.SqlClient • 构造函数, 四个重载版本: publicSqlDataAdapter() publicSqlDataAdapter(SqlCommand selectCommand) publicSqlDataAdapter(string selectCommandText, SqlConnection selectConnection) public SqlDataAdapter(string selectCommandText, string selectConnectionString) • 其中,参数selectCommand用于设置实现Select语句的命令对象(SqlCommand类型) • selectCommandText用于设置Select语句文本, • selectConnection用于设置连接对象。
10.3.4 DataAdapter对象 • 下面四组语句是等价的(其作用都是从数据表student提取所有的数据,cmd为已经初始化好数据库连接和查询语句的SqlCommand对象,strSQL是存放SQL语句的字符串, ConnectionString 存放连接字串): • SqlDataAdapter DataAdapter = new SqlDataAdapter(); //第一组 DataAdapter.SelectCommand = cmd; • SqlDataAdapter DataAdapter = new SqlDataAdapter(cmd); //第二组 • SqlDataAdapter DataAdapter = new SqlDataAdapter(strSQL, conn); //第三组 • SqlDataAdapter DataAdapter = new SqlDataAdapter(strSQL, ConnectionString); //第四组
10.3.4 DataAdapter对象 • DataAdapter对象包含有SelectCommand、InsertCommand、UpdateCommand和DeleteCommand四个属性,用来定义处理数据存储中数据的命令,并且每个命令都是对Command对象的一个引用,可以共享同一个数据源
10.3.4 DataAdapter对象 • DeleteCommand属性:用于获取或设置一个 SQL 语句或存储过程,以从数据集中删除记录。而要执行相应的SQL语句和存储过程,可调用ExecuteNonQuery()来实现。 • 例如,从表student中删除学号为‘20102002’的记录,可以用下列代码实现: //…数据库连接代码 SqlDataAdapter DataAdapter = new SqlDataAdapter(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = "delete from student where 学号 = '20102002'"; DataAdapter.DeleteCommand = cmd; int n = DataAdapter.DeleteCommand.ExecuteNonQuery(); MessageBox.Show("有条 " + n.ToString() + " 记录被删除!");
10.3.4 DataAdapter对象 • InsertCommand和UpdateCommand属性 • 用于获取或设置一个SQL语句或存储过程: • 前者用于实现向数据源插入记录 • 后者用于更新记录。它们的使用方法与DeleteCommand属性相同。
10.3.4 DataAdapter对象 • SelectCommand属性,获取或设置一个SQL语句或存储过程,用于在数据源中选择一个记录集。例如,执行下列代码后,将数据表student中的数据提取到DataAdapter对象中: SqlConnection conn = new SqlConnection(ConnectionString); conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = "SELECT * FROM student"; SqlDataAdapter DataAdapter = new SqlDataAdapter(); DataAdapter.SelectCommand = cmd;
10.3.4 DataAdapter对象 • Fill()方法: • 执行SelectCommand中的查询,并将结果填充到DataSet对象的一个数据表(DataTable)中。 • DataSet对象可以理解为元素为DataTable类型的数组,每次填充时是按照既定的设置将结果集填充到对应的元素中。 • 该方法有多个重载版本,其中常用两种: • Fill(DataSet dataset) • Fill(DataSet dataset, string srcTable) //其中,参数srcTable是用于设置所填充的数据表的名称。
10.3.4 DataAdapter对象 • 例如,下列语句都是将DataAdapter中的数据填充到dataset对象中,但这两次填充分别位于dataset对象不同的两个数据表中,表名分别为t1和t2: DataAdapter.Fill(dataset, "t1"); DataAdapter.Fill(dataset, "t2");
10.3.4 DataAdapter对象 • Update()方法: • 该方法向数据库提交存储在DataSet(或DataTable、DataRows)中的更改。该方法会返回一个整数值,表示成功更新的记录的数量。 • Update语句的生成可有SqlCommandBuilder的构造函数自动完成。 • 例如: SqlCommandBuilder builder = new SqlCommandBuilder(DataAdapter); DataAdapter.Update(dataset, "Table");
10.3 ADO.NET对象 10.3.5 DataSet对象 • 每一个DataSet对象通常是一张或多张数据表(DataTable对象)的集合。 • 当DataAdapter对象将数据填充到DataSet对象以后,就可以利用DataSet对象提供的属性和方法对数据进行离线操作。再次连接数据库时,可根据需要将更改结果一次性传送到数据库中 • 操作可以是查询记录、添加记录、修改记录和删除记录,并通过DataAdapter对象的Update()方法可以将对记录的更新结果提交到数据库中。 • 由于DataSet的智能化,只有数据中被更改的部分才会被发送回数据库
10.3.5 DataSet对象 (1)获取DataSet对象中所有的数据表(DataTable对象), 类似如下代码: for (int i = 0; i < dataset.Tables.Count; i++) { DataTable dt = dataset.Tables[i]; //获取所有的数据表 listBox1.Items.Add(dt.ToString()); //将表名输出到listBox1中 } 其中,dataset.Tables.Count返回dataset中表的数量,dataset.Tables[i]返回索引为i的数据表(DataTable对象)。
10.3.5 DataSet对象 (2)获取DataSet对象中表的所有字段名(DataTable对象),下面代码是获取数据表t2的所有字段名: for (int i = 0; i < dataset.Tables[“t2”].Columns.Count; i++) { listBox1.Items.Add(dataset.Tables[“t2”].Columns[i].ToString()); //获取列名输出到listBox1中 } 其中,dataset.Tables[“t2”].Columns.Count返回表t2的字段的数量,如果表t2在dataset中的索引为0,则可以写成Tables[0]
10.3.5 DataSet对象 (3)提取指定数据表中的所有数据项: for (int i = 0; i < dataset.Tables["t2"].Rows.Count; i++) { DataRow dr = dataset.Tables["t2"].Rows[i]; //获取索引为i的行 string s = ""; for (int j = 0; j < dataset.Tables["t2"].Columns.Count; j++) { s += dr[j].ToString() + "\t"; //获取行dr中索引为j的数据项 } listBox1.Items.Add(s); } 其中,dataset.Tables[“t2”].Rows.Count返回表t2的行数, dataset.Tables[“t2”].Rows[i]返回索引为i的行, dataset.Tables["t2"].Columns.Count返回表的列数。
10.3.5 DataSet对象 • (4)数据绑定 • 绑定方法一:利用控件的DataBindings属性的Add方法把DataSet中某一个数据表中的某一列和组件的某个属性绑定起来,从而达到显示数据的效果。 • 例如,下列语句将dataset中表t2的“姓名”字段绑定到控件textBox1的Text属性中: textBox1.DataBindings.Add(“Text”, dataset, “t2.姓名");
10.3.5 DataSet对象 • (4)数据绑定 • 绑定方法二:将数据绑定到DataGridView控件中,即将控件的DataSource属性值设置为相应的DataSet对象,将控件的DataMember属性值设置为DataSet对象中的表名。 • 例如,下列语句是将dataset中数据表t2中的数据显示到控件dataGridView1中: DataAdapter.Fill(dataset, "t2"); dataGridView1.DataSource = dataset; dataGridView1.DataMember = "t2"; //将数据显示在dataGridView1
10.3.5 DataSet对象 • (5)数据更新: 利用DataAdapter对象的Update()方法来保存在DataSet对象所作的更新。 • 例,在对控件dataGridView1中的数据进行修改后,可以用下列两条语句将更新保存到数据库 SqlCommandBuilder builder = new SqlCommandBuilder(DataAdapter); //创建builder语句不能缺少 DataAdapter.Update(dataset, “t2”);//将所作的更新保存到数据库中 ——在调用Update()方法更新数据时,要保证Select返回的结果集包含主健列(当然,对应的数据表要定义主健),否则会出现这样的异常提示信息:“对于不返回任何键列信息的SelectCommand不支持UpdateCommand的动态 SQL 生成!”。
10.3.5 DataSet对象 • Clear: • 该方法用来清除DataSet对象中所有的表 • 删除DataSet对象中存储的所有数据 • 释放DataSet对象
10.3.5 DataSet对象 • 【例10.1】使用有关DataSet对象的方法,实现以下程序功能: • (1)将两个数据源(对应数据库MyDatabase中的表student和表teacher)的数据分别填充到DataSet对象中,形成该对象中的两个表t1和表t2; • (2)提取t1的所有字段名以及t1中所有的数据项,并显示在listBox1控件中; • (3)将t2绑定到dataGridView1控件并显示t2中的数据,同时将表t2中的字段t_name绑定到textBox1并显示该字段的数据项。
【例10.1】 • 创建步骤如下: (1)创建窗体应用程序DataSetApp,在窗体上添加Button、TextBox、DataGridView和ListBox,并适当设置它们的属性、位置和大小:
【例10.1】 (2)编写代码(以下是核心代码): private void button1_Click(object sender, EventArgs e) { SqlConnection conn = null; SqlDataAdapter DataAdapter = null; DataSet dataset = null; try { string ConnectionString = "Data Source=mzq; "+ "Initial Catalog=MyDatabase;Persist Security Info=True; "+ "User ID=sa;Password=sql2008"; conn = newSqlConnection(ConnectionString); conn.Open(); DataAdapter = new SqlDataAdapter(); dataset = new DataSet(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = "SELECT * FROM student"; DataAdapter.SelectCommand = cmd; DataAdapter.Fill(dataset, "t1"); //第一次填充
【例10.1】 cmd.CommandText = "SELECT * FROM teacher"; DataAdapter.SelectCommand = cmd; DataAdapter.Fill(dataset, "t2"); //第二次填充 string s = " "; //获取表t1中的所有列名 for (int i = 0; i < dataset.Tables["t1"].Columns.Count; i++) s += dataset.Tables["t1"].Columns[i].ToString() + "\t"; listBox1.Items.Add(s); //提取表t1中的数据项 for (int i = 0; i < dataset.Tables[0].Rows.Count; i++) { DataRow dr = dataset.Tables[0].Rows[i]; s = ""; for (int j = 0; j < dataset.Tables[0].Columns.Count; j++) { s += dr[j].ToString() + "\t"; } listBox1.Items.Add(s); }
【例10.1】 //将表t2中的字段t_name绑定到textBox1 textBox1.DataBindings.Add("Text", dataset, "t2.t_name"); //将dataset绑定到dataGridView1 dataGridView1.DataSource = dataset; //在dataGridView1中显示表t2中的数据 dataGridView1.DataMember = "t2"; } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { if (conn != null) conn.Dispose(); if (dataset != null) dataset.Dispose(); if (DataAdapter != null) DataAdapter.Dispose(); } } }
数据库应用程序开发步骤 数据库应用程序开发的步骤如下: 1. 初步设计(总体设计、详细设计) 根据用户的需求,定义数据库和应用程序的功能 2. 功能实现 将客户需求功能分成几个合理的功能块,分别进行程序设计、调试 3. 运行和维护程序 根据用户的建议和要求对数据库应用程序进行适当的修改和完善,从而提高程序的性能
创建ADO.NET数据库应用程序的步骤 创建一个ADO.NET数据库应用程序的一般步骤: ①创建Connection对象,连接数据库。创建Command对象,执行SQL命令 ②创建DataAdapter对象,提供数据源与记录集之间的数据交换,数据库与内存中的数据交换 ③创建DataSet对象,将从数据源中得到的数据保存在内存中,并对数据进行各种操作等 ④创建Windows窗体,并向其中添加必要的控件,设置各控件的属性 ⑤编写主要控件的事件代码,实现程序的功能