ADO.NET 连接方式进行数据访问
1. 连接环境简介
1.1. 连接环境的特点
• 连接环境是指用户在这种环境下始终保持与数据源的连接
• 优点
–环境易于实施安全控制
– 同步问题易于控制
• 数据实时性优于其他环境
• 缺点
– 必须保持持续的网络连接
– 扩展性差
1.2. 连接环境下的对象模型
• XxxConnection
– 建立与数据源的连接,如SqlConnection 用于建立与Microsoft SQLServer™ 的连接,OleDbConnection用于建立与任何支持OLEDB 的数据源的连接
• XxxCommand
– 执行数据源的命令,如 SqlCommand 可以调用一个 Microsoft SQL Server™ 的存储过程,XxxCommand 对象的ExecuteReader 方法可以
返回一个XxxDataReader 对象
• XxxDataReader
– 以只读的、前向的方式,以流的形式读取数据,例如SqlDataReader 可以读取Microsoft SQL Server™ 中的数据
– XxxDataReader 由 XxxCommand(通常是SELECT命令)的 ExecuteReader 方法返回
• XxxXmlReader
– 提供以快速的、无缓存的、前向的方式读取XML数据
1.3. 连接到数据源
定义连接
• XxxConnection (如SqlConnection)
• 连接字符串是包含数据连接参数的一个字符串,用于定义对数据源的连接
• 连接字符串中包含的参数
• 连接字符串的重要参数:
– Provider 连接所用的数据提供程序的种类
– Data Source 要连接的 SQL Server 的名称
– Initial Catalog 要连接的数据库的名称
– Integrated Security 使用Windows 验证确定用户权限
– User ID/Password SQL Server登录名称和密码
– Persist Security Info 连接后是否传送安全信息
1.4. 打开和关闭连接
• 打开连接
– XxxConnection.Open()
• 关闭连接
– XxxConnection.Close()
• 退出连接池
– XxxConnection.Dispose()
2. 创建命令
2.1. Command 对象
• Command 对象是一个SQL语句或者存储过程的引用
• Command 对象可以直接被执行
• 属性
– Name:可选属性,可以用于引用该对象
– Connection:连接对象的引用,与数据库交互
– CommandType:Text、StoredProcedure、DirectTable 的一种
– CommandText:SQL 语句或者存储过程的名字
– Parameters :可以有零个或多个参数
2.2. Command 对象的重要方法
• ExecuteScalar
–返回一个惟一的值
• ExecuteNonQuery
–用于更新数据库或改变数据库结构,返回被影响的行数
• ExecuteReader
–返回数据行的集合
• ExecuteXmlReader (仅限于SqlCommand)
–返回一个 XML 的结果集
3. 返回单个值
3.1. 返回单个值
• 使用ExecuteScalar()方法
• ADO.NET 比 ADO 效率更高,返回整个记录集
• 示例
– 一个特定产品的库存数量
– 有多少个产品
–使用 COUNT、MAX、MIN、AVERAGE
3.2. DEMO
执行返回单个值的Command 命令
4. 返回数据行
• 使用ExecuteReader()方法
–返回一个 DataReader
– 例如: SqlDataReader、OleDbDataReader
• DataReader
– 只读、前向,数据行的流
5. 使用 DataReader 获取数据
• Read 方法
– 得到下一行
– 如果还有后续数据行存在,返回True;反之返回False
• Item 属性
– aReader[“aColumnName”] 或aReader[columnPosition]
• GetXxx 方法,例如: GetString、 GetInt32
– GetString[ColumnPosition](以基数零开始)
• GetValues 方法
– 一次返回当前行所有的列,高效
• IsDbNull 方法
– 用于测试是否返回NULL
• Close 方法
– Read 方法返回 False 时,应该调用 Close 方法关闭 DataReader,释放连接
6. 返回多个结果集
• 一个存储过程可能包含多条 SQL 语句
–将相关的任务分组
– 封装业务逻辑
• 如果一个存储过程返回了多个结果集
– 调用NextResult 移到下一个结果集
• 判断有多少数据行被一个存储过程影响
–使用 RecordsAffected 属性
7. 不返回值
• 使用ExecuteNonQuery()方法
• 执行DDL和DCL语句
– CREATE/ALTER/DROP
– GRANT/DENY/REVOKE
• 执行其它DML语句
– INSERT/UPDATE/DELETE
8. Command 命令的参数
• 介绍
– SQL 语句和存储过程可以有输入输出参数以及返回值
– Command对象参数用来设置或者返回这些参数
– SqlParameter、OleDbParameter
• ParameterName
– 命令参数的名称,例如@CatId
• DbTtype
– 连接到数据库的类型,有 SqlType 和 OleDbType
• Direction
– ParameterDirection 枚举集指定的值,包括:
• ParameterDirection.Input(输入)
• ParameterDirection.InputOutput(输入输出)
• ParameterDirection.Output(输出)
• ParameterDirection.ReturnValue(返回值)
9. 事务
• 事务是一系列相互关联的任务,作为一个整体成功提交或者失败(提交或者回滚)
• ACID
– Atomicity (原子):事务或者全部提交,或者全不提交
– Consistency(一致):事务保证了数据的完整性
– Isolation(分离):事务处理了数据操作的并发性
– Durability(持续):即使在事务结束后发生系统崩溃等灾难性情况,事务涉及的数据操作也将正常保存
9.2. 使用 T-SQL 实现事务
• SQL事务语句
– BEGIN TRAN、COMMIT TRAN、ROLLBACK TRAN
• 代码示例
BEGIN TRAN DECLARE @orderDetailsError int, @productError int DELETE FROM "Order Details" WHERE ProductID=42 SELECT @orderDetailsError = @@ERROR DELETE FROM Products WHERE ProductID=42 SELECT @productError = @@ERROR IF @orderDetailsError = 0 AND @productError = 0 COMMIT TRAN ELSE ROLLBACK TRAN
9.3. 使用 ADO.NET 管理事务
• XxxConnection – 例如SqlConnection
– BeginTransaction
• XxxTransaction – 例如SqlTransaction
– Commit
– Rollback
• 隔离级别