ADO.NET数据库访问
ado.net -> 微软研发
访问数据源步骤:
1.创建连接
2.发出数据请求
3.执行命令
4.处理
5.关闭连接
发展阶段:
1.ODBC(Open Database Connectivity)
2.OLE DB(Object Linkig and Embedding Database)
3.ADO(ActiveX Data Objects)
4.ADO.NET
ado.net可采用无连接方式访问和处理数据,只在必要时连接数据库,不使用时关闭连接。
体系架构:数据提供程序+DataSet
数据提供程序(Data Provider)
1.Connection 连接类:用来和数据源进行连接
2.Command 命令类:用来从数据库中返回数据、修改数据或运行存储过程
3.DataAdapter 数据适配器类:是数据源和数据集DateSet对象交换数据的桥梁,他是负责将数据库中的数据填充到DataSet对象中
4.DataReader 数据读取器类:提供了对数据库的快速制度、前向访问功能
数据集(DataSet)
- 数据集 DataSet 可以理解为一个本地的小型数据库。即 ADO.NET 通过数据提供程序获得数据源的数据后,在客户机的内存中缓存的数据库,即内存中的数据库。
- 数据集 DataSet 位于应用程序和数据源之间,这使得用户可以使用相同的方式,来操作从不同数据源取得的数据。
- 数据集的缺点是要求高速缓存大量的数据。
- DataSet 是 ADO.NET 的非连接(断开)结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,ADO.NET结构可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。
1.什么是Data Provider
Data Provider用于连接数据库、执行命令和检索结果。这些结果将被直接处理,或放置在 DataSet 中以便根据需要向用户公开、与多个源中的数据组合,或在层之间进行远程处理。.NET 的数据提供程序是轻量的,它在数据源和代码之间创建最小的分层,并在不降低功能性的情况下提高性能。
Data Provider的四套内置的数据提供程序
SQL Server.NET 数据提供程序 (System.Data.SqlClient 命名空间)
提供一组对象来建立数据集的表和 SQL Server 数据库中的表之间的联系;
SQL Server .NET 数据提供程序具有自己的一套访问 SQL Server 数据源的协议,对访问 SQL Server 数据库提供了特殊的优化,可以直接访问 SQL SERVER 而不需添加 OLEDB 或 ODBC,因此是轻量级的,效率更高。
OLE DB.NET数据提供程序 (System.Data.OleDb 命名空间)
用来建立与 OLE DB 数据源之间的连接;
需借助 OLE DB 服务组件和数据库的 OLE DB 支持程序来访问数据库。由于需要通过一些中间层,因此在性能上有些损失;
适用于所有提供了 OLE DB 接口的数据源。
ODBC.NET数据提供程序 (System.Data.ODBC 命名空间)
通过 ODBC 与数据源进行通信,适合于所有提供了 ODBC 接口的数据源。
Oracle.NET 数据提供程序 (System.Data.OracleClient 命名空间)
通过 Oracle 客户端与数据源进行通信;
用于访问 Oracle 数据源。
2.Data Provider的四个核心基类
类名 | 说明 |
---|---|
DbConnection 类 | 表示道数据库的连接 |
DbCommand 类 | 表示要对数据源执行的SQL语句或存储过程 |
DbDataReader 类 | 继承DataAdapter的大部分功能 |
DbDataAdapter 类 | 从数据源返回只读的、向前的数据 |
3.核心类的作用、属性和方法
(1)Connection类:
- Connection 类用于建立到指定数据库的连接。
- 任何对数据源的操作都需要建立一个连接对象。
- Connection类的主要成员
属性/方法 | 说明 |
---|---|
ConnectionString | 连接字符串 |
Open() | 打开数据库连接 |
Close() | 关闭数据库连接 |
- 不同命名空间的Connection类
命名空间 | 对应的Connection类 |
---|---|
System.Data.Odbc | OdbcConnection |
System.Data.OleDb | OleDbConnection |
System.Data.SqlClient | SqlConnection |
System.Data.OracleClient | OracleConnection |
- 除了Connection类外,其他类的命名也相似
(2)Command类
- 在利用 Connection 类建立了到数据源的连接后,就可以利用 Command 对象对数据源执行 SQL 语句或存储过程。
- 可以把 Command 对象看成是向 DataReader 对象返回数据结果流的工具。
(3)DataReader类
- DataReader 对象提供一种从数据库读取只进的行流的一种方式。它是读取单向只读数据的最快方法;
- DataReader 对象一次只在内存中存储一个记录,所以内存资源负荷最小;什么记录?
- 使用 DataReader 时,关联的 Connection 忙于服务 DataReader,除了关闭以外不能执行其他任何操作。所以,使用完DataReader 后,要注意尽快关闭它;
(4)DataAdapter类
- DataAdapter 对象用于从数据源中检索数据并填充 DataSet 中的表,完成无连接访问;
- DataAdapter 还会把对 DataSet 作出的更改反馈回数据源;
- 在 DataAdapter 的方法中,Fill() 和 update() 方法是用得最多的;
3.Date Provider中其他重要的类
- DbParameter类
定义了命令和存储过程的输入、输出和返回值参数 - ConnectionStringBuilder类
提供一种用于创建和管理由 Connection 对象使用的连接字符串的内容的简单方法 - CommandBuilder类
自动生成 DataAdapter 的命令属性或从存储过程中派生参数信息
ADO.NET两种访问方式
有连接模式
- 取得数据库连接之后,保持数据库连接,通过向数据库服务器发送SQL命令方式更新数据库
- 特点:数据实时性好,同步问题易于控制,但是必须保持网络连接。
- 主要使用的基本类包括:
- Connection
- Command
- DataReader
有链接模式下数据库访问步骤:
- 通过Connection连接到数据库服务器;
- 设置连接字符串等参数,打开连接;
- 通过Command在数据库上执行SQL命令,如update,insert,delete,select
- 如果只是查询操作,可以通过DataReader 读取数据
- 关闭连接
//使用命名空间
using namespace System.data.OleDb;
// (1)创建连接字符串
string str = "server=" + textBox1.Text.Trim() + ";uid=" + textBox2.Text.Trim() + ";pwd=" + textBox3.Text.Trim() + ";database=study; Provider=SQLNCLI11;";
// (2)定义并初始化一个连接对象conn
OleDbConnection conn = new OleDbConnection(str);
// (3)定义并初始化一个命令对象cmd
OleDbCommand cmd = new OleDbCommand("select * from student", conn);
//(4)打开连接
conn.Open();
//(5)执行命令对象,并接收返回的值
OleDbDataReader dataReader = cmd.ExecuteReader();
// (6)绑定并显示数据
BindingSource Bs = new BindingSource();
Bs.DataSource = dataReader;
dataGridView1.DataSource = Bs;
//(7)关闭连接
dataReader.Close();
conn.Close();
无连接模式(断开式访问模式)
- 当需要对数据进行长时间处理时采用该模式,数据库服务器中数据在本地有一个副本,保存在中。
- 特点:基于无连接的数据库访问,具有执行效率高、数据库连接占用时间短、修改记录易更改和回滚等优点,但是也在一定程度上导致了数据更新的不及时。
- 主要使用的基本类:
- Connection
- Command
- DataAdapter
DataSet //有链接中没有用到
- 方法:
- DataAdapter取得数据,把数据放入本地内存DataSet中,断开与服务器的连接,所有修改都针对DataSet 进行,最后再通过DataAdapter更新回数据库。
无连接模式下数据库访问步骤
- 设置Connection连接字符串等参数;
- 设置Command在数据库上要执行的SQL命令,如update,insert,delete,select;
- 将以上两个类的参数传递给DataAdapter,由DataAdapter完成数据库连接和对数据库的操作;
- DataAdapter把数据库fill到DataSet中;
- 更改DataSet中的数据;
- DataAdapter将更改提交到数据库,并自动关闭连接
// (1)创建连接字符串
string str = "server=" + textBox1.Text.Trim() + ";uid=" + textBox2.Text.Trim() + ";pwd=" + textBox3.Text.Trim() + ";database=study; Provider=SQLNCLI11;";
// (2)定义并初始化一个连接对象conn
OleDbConnection conn = new OleDbConnection(str);
// (3)定义并初始化一个命令对象cmd
OleDbCommand cmd = new OleDbCommand("select * from student", conn);
// (4)定义并初始化一个数据适配器对象oda,DataAdapter对象会自动打开连接,自动关闭连接
OleDbDataAdapter oda = new OleDbDataAdapter();
// (5)为数据配器oda的SelectCommand属性赋值
oda.SelectCommand = cmd;
// (6)定义并初始化一个数据集对象ds
DataSet ds = new DataSet();
ds.Clear();
// (7)数据适配器将取回的数据灌入数据集
oda.Fill(ds, "student");
// (8)显示数据
dataGridView1.DataSource = ds.Tables["student"];
Connection对象
- ADO.NET强大的优势在于对不同的数据源提供一致的访问。.NET对不同数据源,使用不同的数据提供程序,这使得我们可以更高效的访问相应的数据源;
- 其中,Connection对象肩负起连接数据源的重任。
1.理解Connection对象
- 对于ADO.NET而言,不同的数据源,都对应着不同的Connection对象。具体Connection对象如下表:
名称 | 命名空间 | 描述 |
---|---|---|
SqlConnection | System.Data.SqlClient | 表示与SQL Server的连接对象 |
OleDbConnection | System.Data.OleDb | 表示与OleDb数据源的连接对象 |
OdbcConnection | System.Data.Odbc | 表示与ODBC数据源的连接对象 |
OracleConnection | System.Data.OracleClient | 表示与Orale数据库的连接对象 |
2.重要的属性
- ConnectionString
- 连接字符串,获取或设置用于打开连接的字符串
- Database
- 在连接打开之后获取当前数据库的名称,或者在连接打开之前获取连接字符中指定的数据库名
- DataSource
- 获取要连接的数据库服务器的名称
- ConnectionTimeOut
- 获取在建立连接时终止尝试并生成错误之前所等待的时间
- State
- 获取描述连接状态的字符串
3.重要的方法
- Open()
- 使用 ConnectionString 所指定的设置打开数据库连接。
- Dispose()
- 释放连接使用的所有资源
- Close()
- 关闭与数据库的连接。 此方法是关闭任何已打开连接的首选方法。Close 方法回滚任何挂起的事务。 然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接。
4.ConnectionString属性
- ConnectionString
- 连接字符串,是一组被格式化的键值对:它告诉ADO.NET数据源在哪里,需要什么样的数据格式,提供什么样的访问信任级别以及其他任何包括连接的相关信息。
(1) 语法格式
- 连接字符串由一组元素组成,一个元素包含一个键值对,元素之间由“;”分开。
- 语法如下:key1=value1;key2=value2;key3=value3...
- 典型的元素(键值对)应当包含这些信息:
- 数据源是基于文件的还是基于网络的数据库服务器,
- 是否需要账号密码来访问数据源,
- 超时的限制是多少,
- 以及其他相关的配置信息。
- 需要根据需要连接的数据源来确定键(key)是什么
(2) 访问SQL Server连接字符串
- ConnectionString构造时常用参数:
- 服务器的名称或ip地址
- 要使用的数据库名称
- 如何通过数据库验证
- 登录用户名和密码
-
连接超时时间
(3)Connection的构建
1.连接到本机数据库的连接字符串通常为
string ConStr=“Server=(local);database=<数据名>;Integrated Security=sspi”
例如:
string ConStr=“Server=(local);database=study; Integrated Security=sspi” //使用Windows身份验证
或
string ConStr=“Server=(local);database=study; Integrated Security=false; uid=<登录名>;pwd=<密码>” //使用Sql server身份验证
2.连接到远程数据库连接字符串通常为
string ConStr=“Server=<IP>;database=<数据库名>; Integrated Security=false;uid=<登录名>;pwd=<密码>”
在远程情况不能使用Integrated Security=sspi,因为本地当前的Windows帐户很可能在远程机上没有被其SQL Server授权。
3.访问Access连接字符串
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\mydatabase.mdb;User Id=admin;Password=;
4.访问MySQL连接字符串
Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
5.如何构建连接字符串
- 连接字符串本质上就是一个字符串,因此可以用
string connStr = "Data Source=myServerAddress;\
Initial Catalog=myDataBase;\
User ID=myUsername;\
Password=myPassword";
或
- DbConnectionStringBuilder类
- DbConnectionStringBuilder类为强类型连接字符串生成基类。之所以要有这样一个类,是因为它更加安全与友好。
- 以SQL Server为例,可以这样构建一个连接字符串:
SqlClient.SqlConnectionStringBuilder builder =� new SqlClient.SqlConnectionStringBuilder();�builder.DataSource = @"(local)\SQLEXPRESS";�builder.InitialCatalog = "myDataBase";�builder.IntegratedSecurity = true;
(4) ConnectionState属性
- State属性描述了与数据源的连接的当前状态。ConnectionState是一个枚举类型。它包括以下成员:
- Closed: 连接处于关闭状态。
- Open: 连接处于打开状态。
- Connecting: 连接对象正在数据源连接。
- Executing: 连接对象正在执行命令。
- Fetching: 连接对象正在检索数据。
- Broken: 与数据源的连接中断。
(5)连接对象的关闭
Close 方法:用于关闭一个连接,可以再调用 Open 方法打开连接,不会产生错误;
Dispose 方法:不仅关闭一个连接,还清理连接所占用的资源。不可以再次直接用 Open 方法打开连接,必须再次重新初始化连接后才能再打开。
(6)Connection对象的使用步骤
以SQL数据提供程序为例:
- 构造SqlConnection的对象;
- 指定连接字符串,设置其他参数;
- 调用Open();
- 操作完毕,调用Close();
String connString=“…..”
SqlConnection conn=new SqlConnection(connString);
Conn.Open();
...
Conn.Close();
(7)编写优雅而又安全的代码
- 添加Ttry...catch块
连接数据库时,可能出现异常,因此需要添加异常处理。对于C#来说,典型的异常处理是添加try...catch代码块。
finally是可选的。finally是指无论代码是否出现异常都会执行的代码块。而对数据库连接资源来说,是非常宝贵的。因此,应当确保打开连接后,无论是否出现异常,都应该关闭连接和释放资源。所以,必须在finally语句块中调用Close方法关闭数据库连接。
SqlConnection conn = new SqlConnection(connStr);
try
{
conn.Open();
}
catch(Exception ex)
{
;//todo
}
finally
{
conn.Close();
}