VB.net数据库编程(08):ADO.net数据访问接口
编程语言与数据库的连接是通过一个接口,达到两者交流,以便两者谈情说爱。
一、接口种类:6种:1、ODBC,面向C/C++。 2、DAO, 面向VB,操作ACCEss 3、RDO,上面的加强型 4、OLE DB 5、ADO, 对OLE DB的加强型 6、ADO.net, ADO的加强型。 二、ADO.net概述:Ado.net基于XML和离线计算模型。 ADO以Recorderset存储,类似单表,若要多表就要多表连接。必须在线 ADO.net可以在线或离线,DataSet直接可以是多表。 ADO使用Com技术,ADO.net基于XML格式,数据类型更丰富。 体系结构如下:
ADO.net的两个核心组件:.Net数据提供程序(左)、DataSet(右)。 .net数据提供程序用来与数据库的连接。包括Connection,Command,DataReader,DataAdapter四个。 DataSet用来与XML数据连接。设计的目的是独立于任何数据源的数据访问,可有多种不同数据,也可用于XML数据。
DataSet它内部用XML描述数据,与平台无关。其内常用对象是DataTable和DataRow等。DataSet通过DataAdapter获得数据, DataAdapter就是DataSet与数据库之间的桥梁,也就是前面的搬运工。它把数据库中的结果集搬运到本地缓存中,这样 就可与数据离线,直接处理DataSet,处理完后,再连接,再搬运回数据库。
DataSet有三个特点: 1、独立性:独立于各数据源。即与数据库不发生关系,专注于处理。 2、离线连接: 一般是离线,只是返回数据库时,才保持连接。 3、XML描述: DataSet对象是用XML格式表示的关系型数据视图。 数据提供程序它提供四个对象,保持与不同数据库连接。 1、SQLServer.net数据提供程序,空间:System.Data.SqlClient, 操作SQl2000或以上版本。 2、OleDb.net数据提供程序,空间:System.Data.OleDb,主要访问Access,FoxPro等 3、OracleDB.net数据提供程序,空间:System.Data.OracleClient,支持Oracle8.1.7以上版本。 4、ODBC.net数据提供程序,空间:System.Data.Odbc 三、ADO.net的五个核心对象这个说五个是: Connection对象负责连接数据库 Command对象负责生成执行SQl语句 DataReader对象负责读取数据库的数据 DataAdapter对象负责在Command对象执行完SQL语句后生成并填充DataSet和DataTable。 DataSet对象负责存取和更新数据。 1、Connection对象表示一个数据源的单个连接。
例一:连接Access的例子: 例二:连接Sqlserver的例子: 2、Command对象它用来执行SQL语句,执行的结果由DataReader和DataAdapter填充到DataSet中,这样就完成 数据库数据操作的工作 。 注1:CommandType有三个: Text,说明是一个SQL语句,这是默认值,不设置时就是它。 TableDirect,一个要操作的数据表的名 StoredProcedure,一个存储过程。 注2:构造函数有四个,用第三个较多。 2.1、Command的构造函数,就是上面的四个方法,这个是重点。 2.2、ExecuteReader方法通过DataReader类型的对象,应用程序可获得执行SQL命令后的结果集。 这个方法有两种定义: 一是ExecuteReader() :不带参数,直接返回一个DataReader结果集; 二是ExecuteReader(CommandBehavior behavior):根据参数Behavior取值类型,决定DataReader类型。 如果behavior是CommandBehavior.SingleRow,则说明返回的ExecuteReader只是结果集中的第一条数据; 如果behavior是CommandBehavior.SingleResult,则说明只返回在查询结果中多个表里的第一个。 如果behavior是CommandBehavior.SequentialAccess,则说明对于返回的ExecuteReader对象只能顺序 读取它包含的列。一旦读过某列,就不能返回再次读取了,以方便性为代价换取读取数据时的高效率。 无论何结果,ExecuteReader方法返回一个DataReader对象,该对象是一个仅向向的只读数据流,所以主要用来执行 基本SQL查询,要求SQL语句返回记录集。 2.2例一:ExecuteReader。用executeReader返回一个DataReader,然后用它来填充(加载到)另一个对象DataTable中,最后DataTable直接绑定到控件上。
2.2例二:利用BindingSource来绑定前面用DataTable绑定数据,下面用BindingSource来绑定。界面一样,代码变化几句:
?
2.3 ExecuteSaclar方法Scalar,标量,是一个值。一个结果集可能有多个记录,每个记录可能有多个列值。因此, 该方法返回的是首行首列的一个值,其它值忽略。主要用于那些聚合运算,比如求有多少个记录,总计是多少,等等。
?
2.4 ExecuteNonQuery方法即,非查询命令。主要用来执行insert,update,delete和那些没有返回结果集的SQL语句,并返回执行命令后影响的行数。 如果insert,update对应的记录不存在,则返回0;如果出错,则返回-1. 注意:因为这个用户不知道成功与否,所以要加入一些提示或再次显示原数据库,以便了解执行情况。 前面几节有这个大量的例子,不再列出。 2.5 ADO.net事务处理。前面说了存储过程,存储过程就是一个批处理。 事务也是一个批处理过程,只不过加强版,即要么全部都成功执行,要么全部失败。(SQL自动会控制它) 所以事务有两个作用: 一致性:同时进行的查询和更新彼此不会发生冲突,其它用户不会看到发生了变化但尚未提交的数据; 可恢复性:一旦故障或失败,数据库会自动地完全恢复未完成的事务(Rollback)。 ADO.net中,使用Connection和Transaction对象来控制事务,事务顺序包括: 一、调用Connecton对象的BeginTransaction方法来标记事务的开始。 二、将Transaction对象分配给要执行的Command的Transaction属性; 三、执行所需的命令; 四、调用Transaction对象的Commit方法来完成事务,或调用RollBack方法来取消事务。 ADO.net事务处理的优点:简单、运行速度快、独立于数据库。 缺点:不能跨多个数据库连接。 事务执行建立在数据库的连接层上,所以需要在事务过程中一直保持数据库连接。 编程流程: 事务开始:Connection对象的BeginTransaction()声明开始 提交事务:即去执行,用Transaction对象的Commit()方法来提交 回滚事务:即事务失败后的全部恢复,用Transaction对象的RollBack()方法来回滚事务。
2.5例:事务提交。从 这个例子中,可以看到事务是多个SQL语句提交执行(批处理),当如果有一条不成功,则全部恢复(不管以前是否成功)。
?
3、DataReader对象首先说明:DataReader不能实例化,即不能用New。它只能由Command对象ExecuteReader()方法来创建,所以2.2例中没用NEw
DataReader对象提供向前的、只读数据,所以只能依次来读: DataReader的Read(),提供下一条记录的读取,返回值是布尔值,为真执行成功,为假说明下一条无记录。 这些记录是不能修改的。而DataSet因为是离线数据集,在本地内存中缓存,所以是可以任意修改的。
DataReader从数据库中检索只读数据流,存储在客户端的网络缓存当中。在内存当中只存储一行,所以开销小,速度快。 由于数据不在内存中缓存,所以在检索大量数据时,DataReader是一种较好的选择。 DataRader还是一个霸王,具有独占性,在已经打开DataReader的情况下,将不能对Connection进行任何操作,所以用完了它就 应及时调用Close()方法关闭。 通过Command对象返回多个结果集,并且通过DataReader对象NextResult()方法来使用。 再次强调它不能New,只能由Command对象的ExecuteReader()方法来创建 。
创建后,读取DataReader对象中的数据有两种方法: 一通过和DataGridView等数据控件绑定,直接输出; 二利用循环将数据取出。(即Read()方法进行循环读取)。 例子:用DataReader对象通过循环读取多条记录。
?
4、DataAdapterDataAdapter数据适配器,它就是一个搬运工:从数据源搬运到本地内存中以便来填充DataSet;或者从本地内中数据搬运回到数据源中。 这两者的数据可以是相同,也可是不同,DataAdapter会自动匹配,发挥“适配”的作用。 从数据源到本地内存,然后再填充就用Fill()方法。 从本地内存到数据源,进行数据库的更新用Update()方法。 DataAdapter对象属性
DataAdapter方法 方法 说明
4.1 DataAdapter对象的构造函数搬运工就是双面间谍,要么向本机的DataSet填充数据,要么就向另一个方向的数据库更新数据。 SqlDataAdapter类的构造函数 SqlDataAdapter() 不带参数,创建SqlDataAdapter对象 用参数selectCommand设置其Select Command属性 SqlDataAdapter(string selectCommandText,SqlConnection selectConnection) selectCommandText:指定新创建对象的SelectCommand属性值; selectConnection:指定连接对象 用参数selectCommandText设置其Select Command属性值, 并设置其连接对象是selectConnection selectConnectionString:指定新创建对象的连接字符串 将参数selectCommandText设置为Select Command属性值, 其连接字符串是selectConnectionString 构造函数可以不带参数,或者带1,2,3个参数,由参数可以看到cmd有时超出自己的范围,跑到Connection的功能上去了。
4.2 DataAdapter对象的Fill()方法这是搬运工填充本地内存的情况。 调用Fill()方法时,DataAdapter将向数据存储区传输一条Select语句,主要用来填充或刷新DataSet,返回值是影响DataSet的行数。
Fill()方法如下: int Fill (DataSet dataset) dataset:需要更新的DataSet srcTable:填充DataSet的dataTable名(就是别名,用户自己命名一个,可以与原表相同) 根据dataTable名填充DataSet 例子:前面已经有了,不再列出,参见:http://blog.csdn.net/dzweather/article/details/8564039
4.3 DataAdapter的Update()方法这是搬运工更新服务器数据库的情况。 调用Update()方法时,DataAdapter将检查参数DataSet每一行的RowState属性,根据RowState属性来检查DataSet里 的每一行是否改变及改变的类型,并依次执行所需的Insert,Update,Delete语句,再将改变提交到数据库中,同时 返回影响的DataSet的行数据。 例子:下面用一个添加一行记录,同时更新DataSet和数据库。 里面用到了DataRow,这个用于添加一个新行NewRow,然后给新行加值.
?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |