ADO.NET复习
ADO.NET
ADO.NET 是以 ODBC (Open Database Connectivity) 技术的方式来访问数据库的一种技术。
在使用 ADO.NET 进行数据库操作时通常会用到 5 个类,分别是 Connection 类、 Command 类、DataReader 类、DataAdapter 类、DataSet 类。
在实际应用中,DataAdapter 与 DataSet 是在查询操作中使用最多的类。
使用代码绑定的方式是应用最多的方式,一方面体现了代码的灵活性,另一个方面也增强了代码的可移植性。
- Connection ,连接数据库,该类主要用于数据库中建立连接和断开连接的操作,并且能通过该类获取当前数据库连接的状态。
- Command ,执行SQL语句,该类主要对数据库执行增加、删除、修改以及查询的操作。
- DataReader,读取数据,该类用于读取从数据库中查询出来的数据,但在读取数据时仅能向前读不能向后读, 并且不能修改该类对象中的值,在与数据库的连接中断时,该类对象中的值也随之被清除。
- DataAdapter,数据库与DataSet的桥梁,该类与 DataSet 联用,它主要用于将数据库的结果运送到 DataSet 中保存,DataAdapter 可以看作是数据库与 DataSet 的一个桥梁,不仅可以将数据库中的操作结果运送到 DataSet 中,也能将更改后的 DataSet 保存到数据库中。
- DataSet,该类与 DataReader 类似,都用于存放对数据库查询的结果,不同的是,DataSet 类中的值不仅可以重复多次读取,还可以通过更改 DataSet 中的值更改数据库中的值。此外DataSet 类中的值在数据库断开连接的情况下依然可以保留原来的值。
ADO.NET思维导图
命名空间
命名空间 | 数据提供程序 |
---|---|
System.Data.SqlClient | Microsoft SQL Server |
System.Data.Odbc | ODBC |
System.Data.OracleClient | Oracle |
System.Data.OleDb | OLE DB |
常用类介绍
Connection 类概述
Connection 类根据要访问的数据和访问方式不同,使用的命名空间也不同,类名也稍有区别,在这里我们使用的是 SqlConnection 类,以及微软提供的 SQL Server 2014 数据库。
SqlConnection 类中提供的常用属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
SqlConnection() | 无参构造方法 |
SqlConnection(string connectionstring) | 带参数的构造方法,数据库连接字符串作为参数 |
Connectionstring | 属性,获取或设置数据库的连接串 |
State | 属性,获取当前数据库的状态,由枚举类型 Connectionstate 为其提供值 |
ConnectionTimeout | 属性,获取在尝试连接时终止尝试并生成错误之前所等待的时间 |
DataSource | 属性,获取要连接的 SQL Server 的实例名 |
Open() | 方法,打开一个数据库连接 |
Close() | 方法,关闭数据库连接 |
BeginTransaction() | 方法,开始一个数据库事务 |
Command 类概述
在 System.Data.SqlClient 命名空间下,对应的 Command 类为 SqlCommand,在创建 SqlCommand 实例前必须已经创建了与数据库的连接。
SqlCommand 类中常用的构造方法如下表所示。
构造方法 | 说明 |
---|---|
SqlCommand() | 无参构造方法 |
SqlCommand(string commandText,SqlConnection conn) | 带参的构造方法,第 1 个参数是要执行的 SQL 语句,第 2 个参数是数据库的连接对象 |
对数据库中对象的操作不仅包括对数据表的操作,还包括对数据库、视图、存储过程等数据库对象的操作,接下来主要介绍的是对数据表和存储过程的操作。
在对不同数据库对象进行操作时,SqlCommand 类提供了不同的属性和方法,常用的属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
CommandText | 属性,Command 对象中要执行的 SQL 语句 |
Connection | 属性,获取或设置数据库的连接对象 |
CommandType | 属性,获取或设置命令类型 |
Parameters | 属性,设置 Command 对象中 SQL 语句的参数 |
ExecuteReader() | 方法,获取执行查询语句的结果 |
ExecuteScalar() | 方法,返回查询结果中第 1 行第 1 列的值 |
ExecuteNonQuery() | 方法,执行对数据表的增加、删除、修改操作 |
DataReader 类概述
DataReader 类在 System.Data.SqlClient 命名空间中,对应的类是 SqlDataReader,主要用于读取表中的查询结果,并且是以只读方式读取的(即不能修改 DataReader 中存放的数据)。
正是由于 DataReader 类的特殊的读取方式,其访问数据的速度比较快,占用的服务器资源比较少。
SqlDataReader 类中常用的属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
FieldCount | 属性,获取当前行中的列数 |
HasRows | 属性,获取 DataReader 中是否包含数据 |
IsClosed | 属性,获取 DataReader 的状态是否为已经被关闭 |
Read | 方法,让 DataReader 对象前进到下一条记录 |
Close | 方法,关闭 DataReader 对象 |
Get XXX (int i) | 方法,获取指定列的值,其中XXX代表的是数据类型。例如获取当前行第1列 double 类型的值,获取方法为GetDouble(o) |
DataAdapter 类概述
DataAdapter 类用于将数据表中的数据查询出来并添加到 DataSet 中,DataAdapter 在 System.Data.SqlClient 命名空间下对应的类名是 SqlDataAdapter。
SqlDataAdapter 类的主要构造方法如下表所示。
构造方法 | 说明 |
---|---|
SqlDataAdapter(SqlCommand cmd) | 带参数的构造方法,传递 SqlCommand 类的对象作为参数 |
SqlDataAdapter(string sql, SqlConnection conn) | 带参数的构造方法,sql 参数是指定对数据表执行的 SQL 语句,conn 是数据库的连接对象 |
SqlDataAdapter() | 不带参数的构造方法 |
从 SqlDataAdapter 类的构造方法可以看出,SqlDataAdapter 类需要与 SqlCommand 类和 SqlConnection 类一起使用。
SqlDataAdapter 类常用的属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
SelectCommand | 属性,设置 SqlDataAdapter 中要执行的查询语句 |
InsertCommand | 属性,设置 SqlDataAdapter 中要执行的添加语句 |
UpdateCommand | 属性,设置 SqlDataAdapter 中要执行的修改语句 |
DeleteCommand | 属性,设置 SqlDataAdapter 中要执行的删除语句 |
Fill(DataSet ds) | 方法,将 SqlDataAdapter 类中查询出的结果填充到 DataSet 对象中 |
Fill(DataTable dt) | 方法,将 SqlDataAdapter 类中查询出的结果填充到 DataTable 对象 中,DataTable是数据表对象,在一个DataSet对象中由多个 DataTable对象构成 |
Update(DataSet ds) | 方法,更新 DataSet 对象中的数据 |
Update(DataTable dt) | 方法,更新 DataTable 对象中的数据 |
DataSet 类是一种与数据库结构类似的数据集,每个 DataSet 都是由若干个数据表构成的,DataTable 即数据表,每个 DataTable 也都是由行和列构成的,行使用 DataRow 类表示、列使用 DataColumn 类表示。
此外,用户还可以通过 DataRelation 类设置数据表之间的关系。
下面介绍 DataSet 类以及 DataTable 类的使用。
DataSet 类概述
DataSet 类中的构造方法如下表所示。
构造方法 | 说明 |
---|---|
DataSet() | 无参构造方法 |
DataSet(string DataSetName) | 带参数的构造方法,DataSetName 参数用于指定数据集名称 |
DataSet 类中常用的属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
Tables | 属性,获取 DataSet 中所有数据表的集合,Tables[0] 代表集合中的第一个数据表 |
CaseSensitive | 属性,获取或设置 DataSet 中的字符串是否区分大小写 |
Relations | 属性,获取 DataSet 中包含的关系集合 |
Clear() | 方法,清空 DataSet 中的数据 |
Copy() | 方法,复制 DataSet 中的数据 |
AcceptChanges() | 方法,更新 DataSet 中的数据 |
HasChanges() | 方法,获取 DataSet 中是否有数据发生变化 |
RejectChanges() | 方法,撤销对 DataSet 中数据的更改 |
DataTable
DataTable 作为 DataSet 中的重要对象,其与数据表的定义是类似的,都是由行和列构成,并有唯一的表名。
从 SqlDataAdapter 类的填充方法 (Fill) 中可以看出允许将数据直接填充到 DataTable 中,这样既能节省存储空间也能简化查找数据表中的数据。
DataTable 中常用的构造方法如下表所示。
构造方法 | 说明 |
---|---|
DataTable() | 无参构造方法 |
DataTable(string TableName) | 带参数的构造方法, TableName 参数用于指定数据表的名称 |
DataTable 与 DataSet 有很多相似的属性和方法,在下表中列出了一些与 DataSet 类不同的属性。
属性 | 说明 |
---|---|
TableName | 属性,获取或设置 DataTable 的名称 |
Columns | 属性,获取 DataTable 中列的集合 |
Rows | 属性,获取 DataTable 中行的集合 |
DataSet | 属性,获取 DataTable 所在的 DataSet |
Constraints | 属性,获取 DataTable 中的所有约束 |
每个 DataTable 对象都是由**行 (DataRow) 和列 (DataColumn) **构成的,下面分别介绍 DataRow 类和 DataColumn 类的使用。
DataRow类
DataRow 类代表数据表中的行,并允许通过该类直接对数据表进行添加、修改、删除行的操作。
DataRow 类中常用的属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
Table | 属性,设置 DataRow 对象所创建 DataTable 的名称 |
RowState | 属性,获取当前行的状态 |
HasErrors | 属性,获取当前行是否存在错误 |
AcceptChanges() | 方法,更新 DataTable 中的值 |
RejectChanges() | 方法,撤销对 DataTable 中的值的更新 |
Delete() | 方法,标记当前的行被删除,并在执行 AcceptChanges 方法后更新数据表 |
在 DataRow 类中没有提供构造方法,需要通过 DataTable 中的 NewRow 方法创建 DataRow 类的对象,具体的语句如下。
DataTable dt = new DataTable();DataRow dr = dt.NewRow();
这样,dr 即为新添加的行,每行数据是由多列构成的,如果在 DataTable 对象中已经存在表结构,则直接使用dr[ 编号或列名 ]= 值
的形式即可为表中的列赋值。
DataColumn 类
DataColumn 类是数据表中的列对象,与数据库中表的列定义一样,都可以为其设置列名以及数据类型。
DataColumn类中常用的构造方法如下表所示。
构造方法 | 说明 |
---|---|
DataColumn() | 无参构造方法 |
DataColumn(string columnName) | 带参数的构造方法,columnName 参数代表的是列名 |
DataColumn(string columnName,Type dataType) | 带参数的构造方法,columnName 参数代表的是列名,dataType 参数代表的是列的数据类型 |
DataColumn 类提供了一些属性对 DataColumn 对象进行设置,常用的属性如下表所示。
属性 | 说明 |
---|---|
ColumnName | 属性,设置 DataColumn 对象的列名 |
DataType | 属性,设置 DataColumn 对象的数据类型 |
MaxLength | 属性,设置 DataColumn 对象值的最大长度 |
Caption | 属性,设置 DataColumn 对象在显示时的列名,类似于给表中的列设置别名 |
DefaultValue | 属性,设置 DataColumn 对象的默认值 |
AutoIncrement | 属性,设置 DataColumn 对象为自动增长列,与 SQL Server 中数据表的标识列类似 |
AutoIncrementSeed | 属性,与 AutoIncrement 属性联用,用于设置自动增长列的初始值 |
AutoIncrementStep | 属性,与 AutoIncrement 属性联用,用于设置自动增长列每次增加的值 |
Unique | 属性,设置 DataColumn 对象的值是唯一的,类似于数据表的唯一约束 |
AllowDBNull | 属性,设置 DataColumn 对象的值是否允许为空 |
DataSet:更新数据库(SqlCommandBuilder)
使用 DataSet 类更新数据库中的数据,还需要使用 System.Data.SqlClient 命名空间中的 SqlCommandBuilder 类自动生成 SqlDataAdapter 对象的添加、修改以及删除方法。
在与 SqlDataAdapter 类联用时,只需要在创建 SqlCommandBuilder 类的实例时使用 SqlDataAdapter 对象作为参数即可,语法形式如下。
SqlCommandBuilder 对象名 = new SqlCommandBuilder(SqlDataAdapter 类的对象 );
可视化数据绑定
ComboBox控件
组合框控件(ComboBox)在 Windows 窗体应用程序中是常用的控件,例如用于存放省市信息、专业、图书类型、房间类型等。
在 Windows 窗体应用程序中提供了可视化数据绑定和使用代码绑定数据的方法。
使用数据绑定的方式绑定组合框控件直接单击组合框的 "" 图标,弹出“ComboBox任务”菜单,如下图所示。
在其中选中“使用数据绑定项”复选框,显示“数据绑定模式”菜单,如下图所示。
在该菜单中
- “数据源”组合框用于选择要连接数据库中的数据表,相当于为控件设置 DataSource 属性;
- “显示成员”组合框用于设置在组合框中显示的列名,可以通过组合框的Text属性获取;
- “值成员”组合框用于设置组合框中的隐藏值,可以通过组合框的 Value 属性获取;
- “选定值”组合框用于设置组合框中所选值使用的列名。
DataGridView 控件
数据表格控件的可视化数据绑定也是通过控件的任务菜单完成的,如下图所示。
在“DataGridView 任务”菜单中提供了“选择数据源”“编辑列”“添加列”,以及“启用添加”“启用编辑”“启用删除”“启用列重新排序”“在父容器中停靠”等选项。
其中:
- 选择数据源:与组合框控件中选择数据源的操作是相同的。
- 编辑列:用于在 DataGridView 控件中编辑列,包括添加列、给列设置别名等操作。
- 添加列:用于向 DataGridView 控件中添加列,并且可以在 DataGridView 控件中添加不同类型的控件用于显示新添加的列,例如添加一个按钮用于修改或删除表中的数据。
- 启用添加:允许用户向 DataGridView 控件中添加一行,相当于将 DataGridView 控件中的 AllowUserToAddRows 属性设置为 True。
- 启用编辑:允许用户编辑 DataGridView 控件中的值,相当于将 DataGridView 控件中的 Readonly 属性设置为 False。
- 启用删除:允许用户删除 DataGridView 控件中的值,相当于将 DataGridView 控件中的 AllowUserToDeleteRows 属性设置为 True。
- 启用列重新排序:允许启用手动列重新设置,相当于将 DataGridView 控件中的 AllowUserToOrderColumn 属性设置为 True。
- 在父容器中停靠:允许 DataGridView 控件在所在的窗体中最大化。
DataGridView控件
为了简化实例,添加课程信息的操作直接在 SQL Server 数据库中完成。
下面分几个步骤完成。
1) 创建课程信息表
创建课程信息表的 SQL 语句如下。
use test;create table course( id int primary key identity(1,1), name varchar(20), credit numeric(3,1), remark varchar(50));
向表中添加数据的语句如下。
insert into course (name, credit, remark) values ('计算机基石 ' , 2, '无');insert into course (name, credit, remark) values ('C# 程序开发', 2.5 , '机房授课');insert into course (name, credit, remark) values ('数据库原理',1,'无');insert into course (name, credit, remark) values ('体育',1,'无');insert into course (name, credit, remark) values ('职业素养培训',0.5,'无');
在 SQL Server 中执行上述 SQL 语句即可完成课程信息表(course)的创建和数据的添加。
2) 课程信息管理界面的设计
在课程信息管理界面中提供了 DataGridView 控件用于显示课程信息,并提供了根据课程名称查找课程信息、修改以及删除的功能。
具体的界面设计如下图所示。
3) 在加载窗体时显示所有课程信息
本例中使用编写代码的方式实现 DataGridView 控件的数据绑定,并在窗体的加载事件中加入数据绑定的代码。
由于查询所有课程信息的代码将在后面的修改和删除功能中重复使用,所以单独定义一个方法来实现查询所有课程信息。代码如下。
//窗体加载事件private void DataGridViewForm_Load(object sender, EventArgs e){ //调用查询全部课程的方法 QueryAllCourse(); }//查询全部课程private void QueryAllCourse(){ //数据库连接串 string connStr = "Data Source=.;Initial Catalog=test;User ID=sa;Password=root"; //创建SqlConnection的实例 SqlConnection conn = null; try { conn = new SqlConnection(connStr); //打开数据库 conn.Open(); string sql = "select * from course"; //创建SqlDataAdapter类的对象 SqlDataAdapter sda = new SqlDataAdapter(sql, conn); //创建DataSet类的对象 DataSet ds = new DataSet(); //使用SqlDataAdapter对象sda将查新结果填充到DataSet对象ds中 sda.Fill(ds); //设置表格控件的DataSource属性 dataGridView1.DataSource = ds.Tables[0]; //设置数据表格上显示的列标题 dataGridView1.Columns[0].HeaderText = "编号"; dataGridView1.Columns[1].HeaderText = "课程名称"; dataGridView1.Columns[2].HeaderText = "学分"; dataGridView1.Columns[3].HeaderText = "备注"; //设置数据表格为只读 dataGridView1.ReadOnly = true; //不允许添加行 dataGridView1.AllowUserToAddRows = false; //背景为白色 dataGridView1.BackgroundColor = Color.White; //只允许选中单行 dataGridView1.MultiSelect = false; //整行选中 dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; } catch (Exception ex) { MessageBox.Show("查询错误!" + ex.Message); } finally { if (conn != null) { //关闭数据库连接 conn.Close(); } }}
运行该窗体,效果如下图所示。