11.1 数据库的基本概念
11.1.1 数据管理技术的发展阶段
11.1.2 数据库的基本术语
数据库
所谓数据库就是按照一定的数据模型组织、存储在一起的,能为多个用户共享的、与应用程序相对独立、相互关联的数据集合。
数据库管理系统
帮助用户建立和管理数据库的软件系统称为数据库管理系统。
11.2 建立Access数据库
Access一般应用于小型的网站系统和一般性的数据存储,比如数据量不大的网站、论坛、留言本,虽然它在性能上没有SQL SERVER,mysql等数据库优秀,但它也具备了所有数据库的特点,基本上能够满足我们的需要。
11.2.1 规划数据库
尽量使数据库设计合理。既包含必要的信息,又能节省数据的存储空间。
主要是规划每一个表的字段和字段类型,不要有冗余。
11.2.2 新建一个数据库
依次选择菜单命令【开始】、【程序】、【Microsoft access】就可以启动Access2003。
11.2.3 新建和维护表
关于字段的注意事项
1、可以字母、数字或下划线。
2、不要使用关键字,比如password、user、from、select等在ASP.NET语法中会用到的词。
在表中输入数据
在主窗口中双击表名,就可以打开输入窗口。
11.2.4 新建和维护查询
利用查询可以更方便的更改分析和处理数据。查询就好比是一张虚拟的表一样,用户可以像在表里操作一样,输入数据或浏览数据。
查询有很几种:简单查询、组合查询、计算查询和条件查询。现在就来建立一个简单查询,只显示学号和姓名两个字段的内容。
新建简单查询
在Access主窗口左侧选择”查询”按钮。
显示查询内容
在主窗口中双击查询名称。
利用SQL语言建立查询
当进行左图时,直接单击【关闭】按钮,然后在主窗口中依次选择【视图】、【SQL视图】菜单命令,就会出现”SQL视图”对话框。
11.3 SQL语言简介
1.Select语句 查询数据
2.Insert语句 添加记录
3.Delete语句 删除记录
4.Update语句 更新记录
11.3.1 Select语句
可以使用Select语句来取得满足特定条件的记录集。也就是说可以从数据库中查询有关记录。
语法:
Select [Top(数值)] 字段列表 From 表 [Where 条件] [Order By 字段]
Select语句示例
(1)选取全部数据
Select * From tbl_Student
(2)选取指定字段的数据
Select Sno,Sname From tbl_Student
(3)选取满足指定条件的字段
Select * From tbl_Student Where Sage>19Select * From tbl_Student Where Sname="张良"Select * From tbl_student Where Sage>19 and Ssex="男“
(4)查询结果排序
Select * From tbl_Student Order By age ASC Select * From stu_info Order By age DESC
(5)选取前若干条记录
Select Top 3 * From tbl_Student
(6)用表中原有字段产生派生字段
select Sno as 学号, Sname as 姓名, Ssex as 性别 from tbl_Studentselect Sno as 学号, Sname as 姓名, Ssex as 性别, Sage+10 as 年龄 from tbl_Student
(7)模糊查询
select * from tbl_Student where Sname like "*行*"
*:代表任意字符
?:代表某一字符
11.3.2 Insert语句
向用户表tbl_Student中增加新成员时,就需要将新用户的数据插入到表tbl_Student中。此时,可以使用SQL语言中的Insert语句来实现这个功能。
语法:
Insert Into 表(字段1,字段2,…) Values (字段1的值,字段2的值,…)
Insert语句示例
(1)只插入部分字段
Insert into tbl_Student(Sno,Sname) values("11000006","罗修")
(2)插入全部字段
Insert into tbl_Student(Sno,Sname,Ssex,Sage,Sdept) values("11000007","王珊","女",20,"软件工程")Insert into tbl_Student values("11000007","王珊","女",20,"软件工程")
11.3.3 Update语句
可以使用Update语句来实现更新数据的功能。
语法:
Update 数据表名 Set 字段1=字段值1,字段2=字段值2,… [Where 条件]
Update语句示例
Update tbl_Student set Sage=22 where Sname="张良"Update tbl_Student set Sage=Sage+1
11.3.4 Delete语句
在SQL语言中,可以使用Delete语句来删除表中无用的记录。
语法:
Delete From 表 [Where 条件]
Delete语句示例
(1)删除满足条件的记录
Delete from tbl_Student where Sname="张良"
(2)删除表中所有记录
Delete From tbl_Student
练习
(1)建立baseinfo表
(2)完成满足以下条件的SQL语句
查询baseinfo表中的所有信息
Select * From baseinfo
只查询baseinfo表中的name和native字段
Select name,native From baseinfo
查询baseinfo表中满足native是“黑龙江”的所有记录
Select * From baseinfo Where native=“黑龙江”
查询baseinfo表中满足specilty是“信息”并且class是“11-1”的所有记录
Select * From baseinfo Where specialty=”信息” and class=”11-1”
向baseinfo表中插入一条新的字段,其id为8,name为”陈斌”,specialty为”信管”,class为”12-2”,native为”吉林”
Insert Into baseinfo(id,name,specialty,class,native) Values(8,”陈斌”,”信管”,”12-2”,”吉林”)
在baseinfo表中将class字段中值为”11-1”的字段均改为”12-1”
Update baseinfo Set class=“12-1” where class=“11-1”
在baseinfo表中删除id值为7的字段
Delete From baseinfo where id=7
作业
建立学生选课系统数据库(SelectCourse)中包含的四张表。用户信息“tbl_User”、学生信息“tbl_Student”、课程信息“tbl_Course”和选课信息“tbl_SC”四个数据表。表的结构、表字段的数据类型及相关说明如下:
1. 系统用户表:系统用户表“tbl_User”用于存放系统用户的相关数据。
2. 学生信息表:学生信息表“tbl_Student”用于存放学生的基础信息。
3. 课程信息表:学生信息表“tbl_Course”用于存放课程的基础信息。
4. 选课信息表:选课信息表“tbl_SC”用于存放学生的选课信息。
11.4 ADO.NET与数据库概述
ADO.NET是一组允许基于.NET的应用程序访问数据库以便读取和更新信息的类,要使用这些类需要引用System.Data命名空间。它以 ActiveX 数据对象 (ADO) 为基础以 XML(扩展标记语言)为格式传送和接收数据,访问数据存储无需连接。
ADO.NET是.NET Framework的重要组成部分,使用ADO.NET可以很方便的访问数据库。ADO.NET是数据库应用程序和数据源沟通的桥梁,主要提供一个面向对象的数据存储结构,用来开发数据库应用程序。
ADO.NET的架构主要是希望能够在做处理数据的同时,不要一直和数据库联机,而导致一直占用系统资源的现象发生。为了解决此问题,ADO.NET将存取数据和数据处理分开,达到离线存取数据的目的,使得数据库能够执行其他操作。因此将ADO.NET中的类大概分为.NET数据提供者对象和用户对象两种。
11.5 ADO.NET类和对象概述
.NET数据提供者对象
.NET数据提供者对象专用于每一种类型的数据源,专用于提供者的用户对象完成在数据源中实际的读取和写入工作。.NET数据提供者对象中要求活动的连接。
用户对象
用户对象是将数据读入到内存中后用来访问和操作数据的对象。用户对象以非连接方式使用。在数据库关闭之后也可以使用内存中的数据。
数据库访问的方式有两种:一种是直接数据访问,另外一种是不连接数据访问。
直接数据访问是一种最容易的访问数据库的方式,使用直接数据访问时,并不需要在内存中保存信息的副本。相反,当数据库连接打开后可以在一段较短时间内维持同数据库的交互,然后数据库就会迅速关闭。
不连接的数据访问将会在内存中的DataSet对象中保存数据的副本,在数据库连接断开后仍然能够操作这些数据。
ADO.NET操作数据库的示意图
.NET数据提供者对象
常用的. NET数据提供者对象分为以下4种:
- SQL Server数据源提供程序:位于System.Data.SqlClient,适用于Sql Servers数据库7.0或以上版本。
- OLE DB数据源提供程序:位于System.Data.OleDb,用于连接可通过OLE DB提供程序访问的任何数据源,如access。
- ORACLE数据源提供数据:位于System.Data.OracleClient,适用于Oracle数据库。
- ODBC数据源提供程序:位于System.Data.Odbc,允许通过ODBC驱动程序管理器来访问数据。
.NET数据提供者对象包括Connection、Command、DataReader和DataAdapter这4个对象。
.NET数据提供者对象——Connection对象:
Connection对象表示与数据源之间的连接。可用它来与数据库建立连接或断开连接。
连接数据库步骤:
1、定义连接字符串
string strcon = @"Provider = Microsoft.Jet.OLEDB.4.0;" + @"Data Source=D:\mydb.mdb";
2、创建 Connection 对象
OleDbConnection myconn = new OleDbConnection(strcon);
3、打开与数据库的连接
myconn.open();
4、关闭与数据库的连接
myconn.close();
.NET数据提供者对象
- Command对象:指定数据库执行的操作。命令包含向数据库提交的信息,并且由OleDbCommand等特定于提供程序的类来实现。
- DataReader对象:DataReader对象只能从数据库中正向读取记录,用于代替DataSet对象。不能用DataReader对象修改数据库中的行。
- DataAdapter对象:用来从数据库中读取数据,并送到DataSet对象中,还要负责保证DataSet对象中的数据和数据库中的数据保持一致。
用户对象
一般性的数据类对象可以为数据库中的信息存储一个本地拷贝,从而可以在切断数据库连接时处理这个信息。
DataSet对象:它可以看作是内存中的数据库。利用DataAdapter对象将数据库中的数据送到该对象中,然后就可以在其中对数据进行各种操作,最后再利用DataAdapter对象将更新反映到数据库中。
为什么使用 DataSet 对象?
- 大批量的查询、修改数据怎么办?
- 想在断开数据库连接的情况下操所数据怎么办?
什么是 DataSet 对象?
DataSet 数据集
- 简单理解为一个临时数据库
- 将数据源的数据保存在内存中
- 独立于任何数据库
数据集的工作原理
如何创建 DataSet 对象
语法:
DataSet 数据集对象 = new DataSet();
示例:
DataSet mydataset = new DataSet();
为什么使用 DataAdapter
如何将数据库的数据放在 DataSet 中?
如何填充数据集
使用 DataAdapter 对象填充数据集
填充数据集
11.6 DataGridView控件的使用
怎样显示 DataSet 中的数据呢?
DataSource:DataGridView 的数据源
11.7 ADO.NET基本数据库编程
常用的数据库编程包括连接数据库、插入新的数据、删除数据和修改数据,即执行SQL语法中的Insert、Delete、 Update语句。
连接并显示数据库中的全部信息:
private void btnSel_Click(object sender, EventArgs e){try{string strcon = @"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=..\SelectCourse.mdb"; //创建数据库连接字符串 //连接数据库 OleDbConnection myconn = new OleDbConnection(strcon);
myconn.Open(); //打开数据库的连接string mysql = "select * from tbl_Student"; //查询SQL语句//创建Adapter对象OleDbDataAdapter mydataAdapeter = new OleDbDataAdapter(mysql, myconn); DataSet mydataset = new DataSet(); //创建数据集//使用Adapter对象填充数据集mydataAdapeter.Fill(mydataset, "cx");//将数据集中的内容绑定到DataGridView控件dgrdvStudent.DataSource = mydataset.Tables["cx"];SetHeaderText(); //设置列标题 myconn.Close(); //关闭数据库的连接}catch (Exception ex){ MessageBox.Show(ex.Message); }}
更改DataGridView数据控件的列标题显示:
为了将DataGridView数据控件(dgrdvStudent)中显示的学生信息具有更好的表达效果,将各列的标题改成相应的中文。因此编写SetHeaderText()方法,然后在修改dgrdvStudent控件的DataSource属性后立即调用此方法,已达到修改列标题的效果,代码如下:
//更改列标题void SetHeaderText(){dgrdvStudent.Columns[0].HeaderText = "学号";dgrdvStudent.Columns[1].HeaderText = "姓名";dgrdvStudent.Columns[2].HeaderText = "性别";dgrdvStudent.Columns[3].HeaderText = "年龄";dgrdvStudent.Columns[4].HeaderText = "所在系";}
按学号查询学生信息:
private void button1_Click(object sender, EventArgs e) //按学号查询
{if (txtNo.Text == ""){ MessageBox.Show("请输入学生的学号!"); }else{ try{ //创建数据库连接字符串string strcon = @"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=..\SelectCourse.mdb"; OleDbConnection myconn = new OleDbConnection(strcon); //连接数据库 myconn.Open(); //打开数据库的连接string mysql = "select * from tbl_Student where Sno='" + txtNo.Text.Trim() + "'"; //查询SQL语句 //创建Adapter对象OleDbDataAdapter mydataAdapeter = new OleDbDataAdapter(mysql, myconn); DataSet mydataset = new DataSet(); //创建数据集 mydataAdapeter.Fill(mydataset, "cx"); //使用Adapter对象填充数据集if (mydataset.Tables["cx"].Rows.Count == 0){ MessageBox.Show("该学号没有学生记录!"); }else{//将数据集中的内容绑定到DataGridView控件dgrdvStudent.DataSource = mydataset.Tables["cx"];SetHeaderText(); } myconn.Close (); //关闭数据库的连接 }catch (Exception ex){ MessageBox.Show(ex.Message); }}
}
Command 对象
Command对象可以使用数据命令直接与数据源进行通信。例如,当需要执行一条插入语句,或者删除数据库中的某条数据的时候,就需要使用到Command对象。Command对象的属性包括了数据库在执行某个语句的所有必要的信息。
ExecuteNonQuery方法:
ExecuteNonQuery方法用来执行Insert、Update、Delete和其他没有返回结果集的SQL语句,并返回执行命令后影响的行数。
插入学生信息:
private void btnAdd_Click(object sender, EventArgs e) //添加学生信息
{ if (txtNo.Text == "" || txtName.Text == "" || txtAge.Text == "" || txtDept.Text == "" || cmbSex.Text == ""){ MessageBox.Show("插入信息不完整!"); }else{ try{ string strcon = @"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=..\SelectCourse.mdb";OleDbConnection myconn = new OleDbConnection(strcon);myconn.Open();string mysql = "insert into tbl_Student values ('" + txtNo.Text.Trim() + "','" + txtName.Text.Trim() + "','" + cmbSex.Text.Trim() + "','" + txtAge.Text.Trim() + "','" + txtDept.Text.Trim() + "')";OleDbCommand mycommand = myconn.CreateCommand();mycommand.CommandText = mysql;mycommand.ExecuteNonQuery();mysql = "select * from tbl_Student";OleDbDataAdapter mydataAdapeter = new OleDbDataAdapter(mysql, myconn);DataSet mydataset = new DataSet();mydataAdapeter.Fill(mydataset, "cx");dgrdvStudent.DataSource = mydataset.Tables["cx"];SetHeaderText();myconn.Close(); }catch (Exception ex){ MessageBox.Show(ex.Message); }}
}
修改学生信息:
将DataGridView控件中的内容与展示控件相关联:
//将DataGridView控件中的内容与展示控件相关联
private void dgrdvStudent_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{int n = dgrdvStudent.CurrentCell.RowIndex;txtNo.Text = dgrdvStudent[0, n].Value.ToString();txtName.Text = dgrdvStudent[1, n].Value.ToString();cmbSex.Text = dgrdvStudent[2, n].Value.ToString();txtAge.Text = dgrdvStudent[3, n].Value.ToString(); txtDept.Text = dgrdvStudent[4, n].Value.ToString();
}
修改学生信息:
private void btnUpdate_Click(object sender, EventArgs e)
{try{string strcon = @"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=..\SelectCourse.mdb";OleDbConnection myconn = new OleDbConnection(strcon); string mysql = "Update tbl_Student set Sname='" + txtName.Text.Trim() + "',Ssex='" + cmbSex.Text.Trim() + "',Sage='" + txtAge.Text.Trim() + "',Sdept='" + txtDept.Text.Trim() + "' where Sno='" + txtNo.Text.Trim() + "'";OleDbCommand mycommand = myconn.CreateCommand();mycommand.CommandText = mysql;myconn.Open();mycommand.ExecuteNonQuery();mysql = "select * from tbl_Student";OleDbDataAdapter mydataAdapeter = new OleDbDataAdapter(mysql, myconn);DataSet mydataset = new DataSet();mydataAdapeter.Fill(mydataset, "cx");myconn.Close();dgrdvStudent.DataSource = mydataset.Tables["cx"]; }catch (Exception ex){MessageBox.Show(ex.Message);} }
删除学生信息:
private void btnDelete_Click(object sender, EventArgs e)
{try{ string strcon = @"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=..\SelectCourse.mdb";OleDbConnection myconn = new OleDbConnection(strcon); myconn.Open();string mysql = "delete * from tbl_Student where Sno='" + txtNo.Text.Trim() + "'";OleDbCommand mycommand = myconn.CreateCommand();mycommand.CommandText = mysql;mycommand.ExecuteNonQuery();mysql = "select * from tbl_Student";OleDbDataAdapter mydataAdapeter = new OleDbDataAdapter(mysql, myconn);DataSet mydataset = new DataSet();mydataAdapeter.Fill(mydataset, "cx");dgrdvStudent.DataSource = mydataset.Tables["cx"];SetHeaderText();myconn.Close();}catch (Exception ex){MessageBox.Show(ex.Message);}
}
退出:
private void btnClose_Click(object sender, EventArgs e)
{Application.Exit();
}