ADO.NET 支持两种数据访问模式:connected 和 disconnected
连接模式数据访问:
ADO.NET Framework提供的核心类:
1、Connection : 连接
2、Command : 执行应用于数据源的命令
3、DataReader : 获取数据源中的数据
ADO.NET使用接口提供(Provider)模型,使用多组不同的数据访问类来与不同的数据源进行通信。对应的基类分别为:DbConnection, DbCommand, DbDataReader, 存在于System.Data.Common
Connection对象
原则:尽可能晚的打开连接,尽可能早的关闭它。必须确保发生异常时数据库连接都会被关闭。利用 Using()语句 或 try {} catch {} finally {}
1、获取提供程序统计信息 StatisticsEnabled----开启获取统计信息的功能
RetrieveStatistics()—IDictionary集合获取统计信息
2、使用连接池提高性能
默认开启连接池,ADO.NET framework 最多能在连接池中保持100个打开的连接。执行关闭连接的操作并不会真正的关闭数据库服务器端的连接,而是将连接放回到连接池中。尽量将数据库连接字符串放在站点配置(web.config)文件中。
Command 对象
SqlCommand.ExecuteNonQuery() 不返回任何结果数据集,执行Update , Delete , Insert 命令,也可以执行 Create table 或 Drop database 命令
SqlCommand.ExecuteScalar() 返回查询结果集中的第一行第一列的那个数据值,返回值类型统一为Object
SqlCommand.ExecuteReader() 返回一个SqlDataReader对象,使用该对象可以从数据库中逐行读取数据集记录。
CommandName.ExecuteReader(CommandBehavior.CloseConnection),该参数会使数据库连接和SqlDataReader 对象关联起来,当从SqlDataReader对象中读取了所有数据记录后,连接将会自动关闭,缺点是不能添加异常处理代码。
添加参数常用方法: CommandName.Parameters.AddWithValue(“@name”,name)
使用AddWithValue()方法,SqlCommand对象自动识别并推测参数的类型和大小。
SqlParameter.ParameterDirection: Input / InputOutput / Output / ReturnValue 参数表示诸如存储过程,内置函数操作的返回值
DataReader 对象
通过检查HasRows属性或者调用Read()方法,判断DataReader对象表示的查询结果中是否包含数据行记录。
在任意时刻上DataReader对象只表示结果集中的一行记录。
1、 返回多个结果集
利用 SqlDataReaderName.NextResult();返回查询结果中的下一个结果集,返回值为true 或 false 。
2、 使用MARS( Multiple Active Resultsets ,多活动结果集 )
必须在数据库连接字符中,指定MultipleActiveResultSets=true。 程序对一个结果集进行遍历的过程中,同时对当前结果集中的记录执行数据库操作。
非连接模式数据访问
核心对象1、DataAdapter 物理存储模式下的数据和内存之间进行交换。
2、DataTable 内存中的数据库表 ,跟踪数据记录的改变
3、DataView 内存中的数据库视图,对数据过滤和排序
4、DataSet 内存中的数据库
缺点:性能变低,占用大量的硬件资源。尽量使用DataReader对象访问数据库。
1、DataAdapter 获取数据装入DataTable中,将DataTable对象中数据写回到物理数据库中。
调用Fill() 方法,SqlDataAdapter 对象会自动创建并打开数据库连接,从数据库中获取数据后,Fill() 方法自动关闭数据库。Fill() 方法会保持传入供其使用的数据库的连接状态,如果数据库已打开,它将不自动关闭。
SqlDataAdapter 可看作是四个对象的集合: SelectCommand , UpdateCommand, InsertCommand , DeleteCommand
如果调用SqlDataAdapter 对象的Update() 方法, 并将该方法传递给DataTable对象,那么SqlDataAdapter 对象将调用其 UpdateCommand,InsertCommand, DelteCOmmand 来更改数据库。
SqlCommandBuilder 类得到了带有Select 命令的 SqlDataAdapter 对象后会自动生成 UpdateCommand, InsertCommand, DeleteCommand 三个命令。
设置 UpdateBatchSize属性设置为一次批执行所希望处理的命令数量,0表示服务器一次处理的最大批大小, 1 表示禁止批量更新
2、DataTable
DataRows 利用DataTable.Select() 获取任意数据行,返回一个DataRow对象数组
DataTable 对象每个数据行有一个RowState 属性:
Unchanged/ Added/Modified/Deleted/Detached(数据行已创建,未加入DataTable)
DataTable 对象每个数据行有一个DataRowVersion属性:
Current(数据行的当前版本)/Default(数据行的默认版本)
/Original(数据行的原始版本)/Proposed(数据行的修改版本)
DataTable.AcceptChanges() //当前版本复制到原始版本
DataTable.RejectChanges() //原始版本复制到当前版本
3、DataView
三个非常重要的属性:
Sort --------排序
RowFilter -----过滤
RowStateFilter -对数据行依照状态进行过滤(OriginalRows,CurrentRows)
DataTable.DefaultView 返回的是一个未排序未过滤的数据视图。
4、DataSet : 多个DataTable 及 表之间的关系
数据库的异步执行
1、用于同时执行多个数据命令显著提高应用程序性能。尤其是数据库命令在不同的数据库服务器端上执行。
2、ASP.NET Framework 使用有限的线程池为服务页面需求。
开启数据库连接的异步执行功能: AsynchronousProcessing = true
在使用异步ADO.NET方法时,必须启用ASP.NET页面的异步执行选项。
<%@ Page Async=”true” AsyncTimeout=” 8” %>
注意:1、存储过程只默认一个返回值,而且类型必须为整数,如果要得到更多的返回值则需要使用输出参数。
2、尝试对输出参数值进行读取时必须先关闭SqlDataReader对象。
3、格式转换 String.Format(“{0 : c }”, variable)
Variable.ToString(“c”);
4、Page 类 属性:MaintainScrollPositionOnPostback 可以使页面在回发后定位到同样的位置。