Download presentation
Presentation is loading. Please wait.
Published byWidya Lie Modified 6年之前
1
C# 程序设计教程 同济大学计算机系基础学科组
2
第九章 数据库应用程序开发 9.1 ADO.NET基础 9.2 数据库查询 9.3 数据库维护 9.4 综合应用 9.5 自主学习
3
9.1 ADO.NET基础 数据库应用程序的开发在软件开发中占有很大比重
C#中,使用ADO.NET获取数据,使用ADO.NET组件开发数据库应用程序
4
访问数据库 在应用程序中,对数据库的访问主要是浏览、修改、添加、删除等操作。 以Access为例,使用ADO.NET访问关系数据库。
5
9.1.1 引例-学生成绩管理程序 自定义的功能控 件 绑定导航控件 鼠标拖放自动产生成的控件和组件 数据集 数据表 数据列
6
引例的实现过程 (1)添加数据源 (2)界面设计 (3)自定义功能控件的编程
“数据”|“添加新数据源”:Students_Scores下Scores表 (2)界面设计 从“数据源”窗口依次将学号、课程、成绩数据列的左侧图标直接拖放到Form1窗体上 将自定义功能控件label1、textBox1、button1、label2拖放到Form1窗体。 (3)自定义功能控件的编程 ①统计记录总数的编程 Form1_Load ②“显示记录”按钮单击事件编程 button1_Click this.label2.Text += this.students_ScoresDataSet.Scores.Count.ToString(); //统计表中记录总数 int i = int.Parse(this.textBox1.Text); scoresBindingSource.Position = i-1;
7
数据库应用系统 数据库应用系统的具体设计过程:首先设计数据库,然后使用ADO.NET 数据访问模型实现前台功能界面和后台数据库之间通讯,直至所有功能完成为止。 数据库应用系统层次结构 图 NET数据库应用系统的三层结构 Access等 数据库 ADO.NET 数据访问模型 后台数据库 中间数据访问模型 前台应用程序
8
DataProvider(数据提供程序)
ADO.NET 体系结构 数据源与DataSet间的桥梁。通过Command对象执行SQL语句,将获得的结果集填充到DataSet对象中;并将对于DataSet对象的更改更新到相应的数据库。 用来容纳DataProvider传递过来的数据库访问结果,或者把应用程序里的执行结果更新到数据库中。可看成为内存中的数据暂存区。 连接数据源、执行SQL语句、检索数据,并能把检索到的结果集填充到DataSet中。 获取来自多个数据源的数据,且在离线情况下管理存储数据 与Command对象的查询命令配合使用,接收Command对象的ExecuteReader方法返回的对象 执行数据库的命令操作,包括检索、插入、删除、更新。 建立数据源的连接。 ADO.NET是与数据库访问操作有关的对象模型的集合,拥有两个核心组件: DataProvider(数据提供程序) Connection对象 Command对象 DataReader对象 DataAdapter对象 SelectCommand InsertCommand DeleteCommand UpdateCommand DataSet(数据集) DataTable对象 DataRow DataColumn Constrain DataRelation对象
9
DataProvider(数据提供程序)
对于不同数据源的类型,ADO.NET分别提供相应的数据提供程序,且每种都包括4种对象: 对象名 OLE DB 数据提供程序的类名 SQL Server数据提供程序的类名 Connection OleDbConnection SqlConnection Command OleDbCommand SqlCommand DataReader OleDbDataReader SqlDataReader DataAdapter OleDbDataAdapter SqlDataAdapter 例如:Access数据库要求引用System.Data.OleDb。
10
ADO.NET数据库访问方式 (一) 通过Command对象直接访问数据库,利用ExecuteReader()方法和DataReader对象进行查询,或利用ExecuteNonQuery()方法进行更新。保持连接! (二)通过DataAdapter填充数据到DataSet对象,进行查询或更新操作后再将数据更改更新到相应数据库。断开连接! 离线式 连接式 数据库 Connection对象 Command对象 ExecuteNonQuery() ExecuteReader() DataReader对象 DataAdapter对象 DataSet对象
11
例 连接数据库
12
数据库连接 应用程序要使用数据时,如何找到数据? 需要建立数据库应用程序与数据库之间的连接!
13
数据库连接 通过Connection对象实现。 OleDbConnection对象负责建立或终止与OLE DB数据源的连接。
OleDbConnection 对象名 = new OleDbConnection(连接字符串);
14
创建连接 创建一个OleDbConnection对象,用于连接Access数据库Students_Scores.accdb。关键代码:
说明提供程序的名称 //设置连接字符串 string strCon =“ Provider=Microsoft.ACE.OLEDB.12.0; Data Source=Students_Scores.accdb”; 数据源文件名 //创建连接对象,对象名objConn OleDbConnection objConn = new OleDbConnection(strCon); 属性ConnectionString
15
或者先创建对象再设置属性 //创建连接对象,对象名objConn //再设置ConnectionString属性
OleDbConnection objConn = new OleDbConnection(); //再设置ConnectionString属性 objConn.ConnectionString = “ Provider=Microsoft.ACE.OLEDB.12.0; Data Source=Students_Scores.accdb”;
16
打开、关闭数据库连接 访问数据库之前: 不需要访问数据库时: objConn.Open() ; //访问数据库
调用Close()方法关闭数据库连接。 objConn.Open() ; //访问数据库 objConn.Close() ;
17
Connection对象的常用属性和方法
属性或方法 说明 ConnectionString 获取或设置用于打开数据库的字符串 DataSource 获取要连接的数据源文件名 Provider 获取连接字符串中提供程序的名称 State 数据库连接状态,只读 Open()方法 按ConnectionString的设置打开数据库连接 Close()方法 关闭与数据源的连接
18
例 连接数据库 要求 建立连接: 显示连接状态 显示提供程序 显示数据源文件 断开连接: 如何实现?
19
建立连接的步骤 ① 导入System.Data.OleDb ② 设置连接字符串
using System.Data.OleDb; ① 导入System.Data.OleDb ② 设置连接字符串 ③ 创建OleDbConnection对象 ④ 打开连接 ⑤ 访问数据库 ⑥ 关闭连接 string conStr Source=G:\Students_Scores.accdb"; OleDbConnection objConn = new OleDbConnection(conStr); objConn.Open(); textBox1.Text = objConn.State.ToString(); textBox2.Text = objConn.Provider ; textBox3.Text = objConn.DataSource; objConn.Close();
20
主要代码 string objStr Source=G:\Students_Scores.accdb"; OleDbConnection objConn; 设置连接字符串 声明连接对象 建立连接事件 objConn =new OleDbConnection (objStr); objConn.Open(); textBox1.Text = objConn.State.ToString(); textBox2.Text = objConn.Provider ; textBox3.Text = objConn.DataSource; 实例化连接对象 打开连接 显示信息 断开连接事件 objConn.Close(); textBox1.Text = objConn.State.ToString(); textBox2.Text = textBox3.Text = ""; 断开连接 显示信息
21
例9.3 查询平均分及详细成绩 从数据库Students_Scores.accdb的表Scores中查询指定学号学生的: 平均分
要求: 从数据库Students_Scores.accdb的表Scores中查询指定学号学生的: 平均分 所有的课程及成绩 如何实现?
22
连接式查询 (1)创建Connection对象 (2)创建Command对象 (3)执行Command对象的相应方法 数据库
ExecuteScalar() ExecuteReader() DataReader对象 (1)创建Connection对象 (2)创建Command对象 (3)执行Command对象的相应方法
23
Command对象 功能: 创建:根据Connection对象和SQL语句创建 执行SQL语句 返回结果 例如:
string strSql = "select * from Scores"; //设置SQL命令 OleDbCommand objCmd = new OleDbCommand(strSql , objConn); //创建命令对象 属性 CommandText 属性 Connection
24
Command对象执行命令的方法 Command对象创建好后,选择相应的方法执行命令对数据库进行操作。
数据查询 方 法 说 明 ExecuteScalar() 执行包含合计函数的SQL语句,返回查询结果集中首行首列 ExecuteReader() 执行SQL查询语句,返回一个DataReader对象 ExecuteNonQuery() 执行插入、修改、删除等SQL语句
25
例9.3—分析 查询平均分时,结果为单值,利用OleDbCommand对象的ExecuteScalar()方法来执行命令。
查询课程分时,需要返回学生的所有课程及成绩,是多行多列的结果集,使用ExecuteReader()方法返回一个OleDbDataReader对象。 返回结果为单值 返回类型为Object,引用时需进行类型转换 数据结果集是以顺序、只读的方式从数据库中获得 Read方法可被循环调用以顺序提取结果集的每一行
26
查询平均分—主要代码 Connection对象实例化 定义执行的SQL语句 Command对象实例化
执行相应方法 objConn = new OleDbConnection (conStr); //连接对象实例化 String sql1= "select avg(成绩) from Scores where 学号='" + textBox1.Text + "'"; objCmd = new OleDbCommand (sql1, objConn); //命令对象实例化 objConn.Open(); //打开连接 textBox2.Text =string.Format("{0:F2}", objCmd.ExecuteScalar() ); objConn.Close(); //关闭连接 Connection对象实例化 定义执行的SQL语句 Command对象实例化 执行ExecuteScalar()方法并显示结果
27
查询课程分—主要代码 定义执行的SQL语句 Command对象实例化 执行ExecuteReader()方法返回DataReader对象
Connection对象 Command对象 执行相应方法 String sql2 = "select 课程, 成绩 from Scores where 学号='" + textBox1.Text + "'";//设置命令文本 objCmd = new OleDbCommand (sql2, objConn); objConn.Open();//打开连接 OleDbDataReader dReader = objCmd.ExecuteReader(); listBox1.Items.Add("课程\t\t成绩"); listBox1.Items.Add("======================"); while (dReader.Read()) listBox1 .Items .Add (String .Format ("{0} \t {1}",dReader [0].ToString (), dReader [1].ToString () )); dReader.Close (); //关闭DataReader对象 objConn.Close(); //关闭连接 定义执行的SQL语句 Command对象实例化 执行ExecuteReader()方法返回DataReader对象 Read方法用于提取结果集中的一行记录 循环调用DataReader对象的Read()方法得到各条结果并显示 dReader[i]等价于dReader.GetValue(i), 获取该行的第i+1列值
28
数据库连接式查询之步骤 创建数据库连接和命令对象 执行SQL语句 由ConnectionString属性指定
由Connection对象和SQL语句 Open()方法 ExecuteScalar():返回首行首列,用来执行含合计函数语句 ExecuteReader():返回DataReader对象,含查询结果集,可通过Read方法逐条读取 Close()方法 创建数据库连接和命令对象 创建Connection对象 创建Command对象 执行SQL语句 打开数据库连接 执行SQL语句 关闭数据库连接
29
例9.4 浏览、查询与统计 基本信息浏览(基本情况表或成绩表浏览) 档案组合查询(按学号或姓名包含字查询学生档案)
个人成绩统计(个人所有课程的平均分、最高、最低分)
30
离线式查询 (1)创建Connection对象 (2)创建DataAdapter对象 (3)结果填充到DataSet对象 数据库
31
DataAdapter对象 大量的数据处理或动态交互数据的情况下 查询或更新数据库 创建: 直接根据Connection对象和SQL语句创建
例如: OleDbDataAdapter objAdapt=new OleDbDataAdapter(strSql,objConn); OleDbDataAdapter objAdapt=new OleDbDataAdapter(); objAdapt. SelectCommand = new OleDbCommand(strSql, objConn);
32
DataAdapter对象的属性和方法 DataSet objDataSet = new DataSet();
DataAdapter对象用于获取Command对象SQL语句执行得到的结果集,将其填充到DataSet对象中,并且将DataSet对象里更新数据的结果返回到数据库。 DataSet objDataSet = new DataSet(); objAdapt.Fill(objDataSet, "S"); 属性和方法 说明 SelectCommand 从数据源检索数据的Command对象 Fill() 方法 将数据源的数据填充到本机的DataSet或DataTable中,且在填充完成后自动断开连接
33
使用DataAdapter填充数据集 或者: Connection对象 DataAdapter对象 填充DataSet对象
string SQL语句= "语句内容"; OleDbDataAdapter DataAdapter对象 = new OleDbDataAdapter(SQL语句, Connection对象); 或者: string SQL语句= "语句内容"; OleDbDataAdapter DataAdapter对象=new OleDbDataAdapter(); DataAdapter对象. SelectCommand = new OleDbCommand(SQL语句, Connection对象); DataSet DataSet对象= new DataSet(); DataAdapter对象.Fill(DataSet对象, "数据表名称字符串");
34
例9.4之基本信息浏览(基本情况表) 定义执行的SQL语句 创建DataAdapter对象 填充DataSet对象 显示结果
Connection对象 DataAdapter对象 填充DataSet对象 string strSql = "Select * From Students";// 设置SQL语句 OleDbDataAdapter myAdapt = new OleDbDataAdapter(); objAdapt.SelectCommand = new OleDbCommand(strSql, objConn);//实例化数据适配器对象 objDataSet.Clear(); objAdapt.Fill(objDataSet, "S");//填充数据集 dataGridView1.DataSource = objDataSet.Tables["S"]; //将数据绑定到网格 定义执行的SQL语句 创建DataAdapter对象 填充DataSet对象 显示结果
35
例9.4 之 档案组合查询 (按学号或姓名包含字查询学生档案)
Connection对象 DataAdapter对象 填充DataSet对象 定义执行的SQL语句 objAdapt.SelectCommand = new OleDbCommand(strSql, objConn); objDataSet.Clear(); objAdapt.Fill(objDataSet, "Search");// 填充数据集 dataGridView1.DataSource = objDataSet.Tables["Search"]; 创建DataAdapter对象 填充DataSet对象 显示结果
36
组合查询执行的SQL语句 if (textBox1.Text != "" && textBox2.Text != "")
strSql = "SELECT * from Students where 学号='" + textBox1.Text + "' Or 姓名 Like'%" + textBox2.Text + "%'"; else if (textBox1.Text != "" ) strSql = "SELECT * from Students where 学号='" + textBox1.Text + "'"; else if (textBox2.Text != "") strSql = "SELECT * from Students where 姓名 Like'%" + textBox2.Text + "%'"; else strSql = "SELECT * from Students";
37
DataSet(数据集)对象 DataSet DataAdapter DataSource 相当于存储在内存中的离线数据库
Fill Update Select Command 相当于存储在内存中的离线数据库 可存储从数据库查询到的数据结果 通过Fill()方法,获得数据,然后与数据库服务器自动断开 对DataSet中的数据集进行浏览、插入、修改和删除等操作 利用DataAdapter对象的Update()方法恢复与数据库的连接,把DataSet中的处理结果更新到数据库
38
例9.4 之 个人成绩统计 (按学号查询学生成绩均值和最值)
Connection对象 DataAdapter对象 填充DataSet对象 定义执行的SQL语句 objAdapt.SelectCommand = new OleDbCommand(strSql, objConn); objDataSet.Clear(); objAdapt.Fill(objDataSet, "Count");// 填充数据集 dataGridView1.DataSource = objDataSet.Tables["Count"]; 创建DataAdapter对象 填充DataSet对象 显示结果
39
个人成绩统计执行的SQL语句 strSql = "SELECT Students.学号,姓名,Avg(成绩) as 平均分,Max(成绩) as 最高分, Min(成绩) as 最低分 From Students,Scores Where Students.学号='" + textBox3.Text + "' and Students.学号=Scores.学号 Group by Students.学号,姓名";
40
数据库离线式查询之步骤 创建数据库连接和适配器对象 填充数据集并显示查询结果 由ConnectionString属性指定
由Connection对象和SQL语句 执行Adapter对象的Fill()方法,将执行SQL得到的数据结果填充到数据集的某数据表中。 将数据绑定到控件,显示信息表 创建Connection对象 创建Adapter对象 填充数据集并显示查询结果 执行Fill()方法 显示查询结果
41
小结 两种访问方式:连接式;离线式 连接式关键:由Connection对象和SQL语句创建Command对象并通过其合适的方法执行命令。
离线式关键:由Connection对象和SQL语句创建DataAdapter对象,调用其Fill()方法填充到数据集 怎么进行数据维护?
42
例9.5 浏览、查询与统计 员工基本信息浏览(载入时) 删除员工信息记录 单条员工信息浏览(dataGridView中点击任一条记录后)
保存对员工信息的修改 新增员工信息记录
43
9.3 数据维护 (1)创建Connection对象 (2)创建Command对象
数据库 Connection对象 Command对象 ExecuteNonQuery() (1)创建Connection对象 (2)创建Command对象 (3)执行Command对象的ExecuteNonQuery()方法
44
Command对象执行命令的方法 方 法 说 明 ExecuteScalar() 执行包含合计函数的SQL语句,返回查询结果集中首行首列
方 法 说 明 ExecuteScalar() 执行包含合计函数的SQL语句,返回查询结果集中首行首列 ExecuteReader() 执行SQL查询语句,返回一个DataReader对象 ExecuteNonQuery() 执行插入、修改、删除等SQL语句 ExecuteNonQuery()
45
员工基本信息浏览(载入时) private void Form1_Load(…) 定义执行的SQL语句 实例化DataAdapter对象
string str2 = "select * from Personal"; objAdapt.SelectCommand = new OleDbCommand(str2, objConn); objDataSet.Clear(); objAdapt.Fill(objDataSet, "P");// 填充数据集 dataGridView1.DataSource = objDataSet.Tables["P"]; 定义执行的SQL语句 实例化DataAdapter对象 填充DataSet对象 显示结果
46
单条员工信息浏览 private void dataGridView1_CellClick(…)
怎么实现? textBox1.Text = dataGridView1.CurrentRow.Cells[0].Value .ToString(); dateTimePicker1.Text = dataGridView1.CurrentRow.Cells[3].Value .ToString();
47
保存对员工信息的修改 定义执行的SQL语句 实例化Command对象 执行ExecuteNonQuery()方法
private void button5_Click(…) 数据修改 + 更新显示 Connection对象 Command对象 ExecuteNonQuery()方法 string strSql = "update Personal set 员工姓名='" + textBox2.Text + "',出生日期='" + dateTimePicker1.Text + "',性别='" + textBox3.Text + "',部门='" + textBox5.Text + "',职称='" + textBox6.Text + "' where 员工编号='" + textBox1.Text + "'"; objCmd = new OleDbCommand(strSql, objConn); objConn.Open(); if (objCmd.ExecuteNonQuery() == 1) MessageBox.Show("修改成功!"); objConn.Close(); 定义执行的SQL语句 实例化Command对象 返回执行命令影响的行数 错误时返回-1 执行命令 执行ExecuteNonQuery()方法
48
保存对员工信息的修改(续) private void button5_Click(…) 定义执行的SQL语句
数据修改 + 更新显示 Connection对象 DataAdapter对象 填充DataSet对象并显示 定义执行的SQL语句 string str2 = "select * from Personal"; objAdapt. SelectCommand = new OleDbCommand(str2, objConn); objDataSet.Clear(); objAdapt. Fill (objDataSet, "new");// 填充数据集 dataGridView1. DataSource = objDataSet.Tables["new"]; 实例化DataAdapter对象 填充DataSet对象 显示结果
49
新增员工信息记录 private void button1_Click(..) 新增员工信息记录
50
新增员工信息记录 定义执行的SQL语句 创建Command对象 执行ExecuteNonQuery()方法
private void button1_Click(..) 数据修改 + 更新显示 Connection对象 Command对象 ExecuteNonQuery()方法 String strSql = "insert into Personal(员工编号,员工姓名,性别,部门,出生日期,职称) values('"; strSql += textBox1.Text + "','" + textBox2.Text + "','" ; strSql += textBox3.Text + "','" + textBox5.Text + "','"; strSql += dateTimePicker1.Value.Date.ToString() + "','"; strSql += textBox6.Text + "')"; //设置命令文本 objCmd = new OleDbCommand(strSql, objConn); //创建命令对象 objConn.Open(); //打开连接 if (objCmd.ExecuteNonQuery() == 1) MessageBox.Show("成功添加1条记录!"); objConn.Close(); 定义执行的SQL语句 创建Command对象 执行ExecuteNonQuery()方法
51
例 9.5 数据更新程序 具有插入新记录、根据学号读记录以及修改记录的功能。 设置连接对象。 编写各按钮事件代码: 设置SQL命令文本
例 9.5 数据更新程序 具有插入新记录、根据学号读记录以及修改记录的功能。 设置连接对象。 编写各按钮事件代码: 设置SQL命令文本 创建命令对象 打开连接 执行命令:采用ExecuteNonQuery()方法 关闭连接
52
例9.6 学生成绩表更新系统 含“添加”、“删除”、“修改”等功能。
53
小结 离线式查询关键:由Connection对象和SQL语句创建DataAdapter对象,调用其Fill()方法填充到数据集
连接式数据维护关键:由Connection对象和SQL语句创建Command对象并通过其ExecuteNonQuery()方法执行命令。 如何利用数据查询和维护技术构架完整的数据库应用系统?
54
9.4 数据绑定 数据绑定:把已经打开的数据集中某个或某些字段绑定到图形界面控件的某些属性上,使该控件自动显示这些数据,且内容将随着数据记录指针的变化而变化。 设计时数据绑定指在设计系统界面时指定绑定控件的数据源,即在系统可视化界面下通过鼠标直接拖放控件或设定控件的相关属性来实现绑定。 运行时数据绑定指通过编写代码来实现,在系统运行时指定绑定控件的数据源。
55
简单型数据绑定:绑定后控件显示出来的内容只是单个字段,一般使用在显示单个值的控件上,如TextBox控件和Label控件。
属性 说明 TextBox Label DataBindings/Text 控件绑定的字段 ComboBox ListBox DataSource 指定填充到控件中的数据源 DisplayMember 控件显示的字段 ValueMember 实际使用的值 DataGridView DataMember 指定绑定的表 复杂型数据绑定:绑定后的控件显示出来的内容是多个字段或记录,一般使用在显示多个值的控件上,如ComBox控件、ListBox控件等。 基本步骤: 1.连接数据库,得到可以操作的DataSet 2.根据不同控件采用不同的数据绑定
56
利用DataGridView控件浏览 添加现有项选择数据文件 在数据源中选择Students表拖动到窗体 自动实现数据绑定
57
例9.7 学生基本情况浏览程序 设计时数据绑定,添加数据源。
在数据源窗口,将各字段左侧的图标拖入窗体。对于“性别”字段,下拉选择把绑定对象更改为ComboBox后再拖入窗体。 在窗体中添加4个Button控件,添加代码 this.studentsBindingSource.MoveFirst(); //Privious、Next、Last label1.Text = (this.studentsBindingSource.Position+1) + "/" + this.studentsBindingSource.Count;
58
例9.8 运行时数据绑定实现例9.7 添加窗体上控件 声明连接对象、适配器对象,创建连接 设置适配器对象,填充数据集 实现控件绑定
添加按钮事件的代码 string strSql = " SELECT * FROM Students "; myAdapt = new OleDbDataAdapter(strSql, strCon); myAdapt.Fill(myDataSet, "Students"); textBox1.DataBindings.Add("Text", myDataSet, "Students.学号"); comboBox2.DataSource = myDataSet; comboBox2.DisplayMember = "Students.性别"; comboBox2.ValueMember = "Students.性别"; this.BindingContext[myDataSet,“Students”].Position = 0; //-=1;+=1; this.BindingContext[myDataSet,"Students"].Position = this.BindingContext[myDataSet,"Students"].Count-1;
59
知识小结 ADO.NET为数据库操作提供了强有力的工具,程序中必须根据数据源的不同类型,引用适当的命名空间。 两种访问方式:连接式;断开式。
Connection用于打开和关闭到特定数据源的连接,Command用于执行数据库操作命令并从数据源中返回结果,最常用的命令是SQL语句。 DataAdapter在数据源和数据集(DataSet)之间架起一座桥梁,使得DataSet连接到数据源中。可以利用Fill()方法将数据源数据填充到DataSet中,然后自动断开与数据库服务器的连接。对DataSet中的数据操作完成后,可以利用Update()方法把处理结果更新到数据库中。 将数据绑定到控件
Similar presentations