数据库基础知识几乎所有的商业应用程序都需要处理大量的数据,并将其组织成易于读取的格式。
这种要求通常可以通过数据库管理系统(MDBS)实现。
MDBs是用高级命令操作表格式数据的机制。
数据库管理系统隐藏了数据在数据库中的存放方式之类的底层细节,使编程人员能够集中精力管理信息,而不是考虑文件的具体操作或数据连接关系的维护。
下面,先介绍几个基本的概念。
数据库:数据库就是一组排列成易于处理或读取的相关信息。
数据库中的实际数据存放成表格(table),类似于随机访问文件。
表格中的数据由行(row)和列(column)元素组成,行中包含结构相同的信息块,类似于随机访问文件中的记录,记录则是一组数值(或称为字段的集合),如图1所示:图1:数据库和表格结构的图形表示记录集:记录集(RecordSet)是表示一个或几个表格中的对象集合的多个对象。
在数据库编程中,记录集等于程序中的变量。
数据库中的表格不允许直接访问,而只能通过记录集对象进行记录的浏览和操作。
记录集是由行和列构成的,它和表格相似,但可以包含多个表格中的数据。
如图2所示网格中的内容来自于一个表格,形成一个记录集。
图中所示的查询结果是所有作者的资料。
图2:BIBlIO数据库的Authors表,所选的行是Authors的相关记录注意:可以把记录看成一种浏览数据库的工具,用户可以根据需要指定要选择的数据,记录集的类型有三类:(1)DynaSets:这是可修改的显示数据;(2)SnapShots:这是静态(只读)的显示数据;(3)Tables:这是表格的直接显示数据。
DynaSets和SnapShots通常用SQL(结构化查询语言)语句生成,SQL将在以后介绍,但现在只要知道SQL语句是从指定数据库中读取数据的标准命令即可。
DynaSets在每次用户数据库时更新,而对记录集的改变会反映在基础表格中。
SnapShots是同一数据的静态显示,其中包含生成snapshots时请求的记录(基础表格中的改变不会在SnapShots中反映出来),自然也不会更改SnapShots。
DynaSets是最灵活、最强大的记录集。
虽然Table类型记录集需要大量间接成本。
SnapShots是最缺少灵活性的记录集,但所要的间接成本最少。
如果不需要更新数据库,只要浏览记录,可以用SnapShots这种类型。
SnapShots类型还有一个变形正向型SnapShots,这种类型SnapShots的限制更多,只能正向移动,但速度更快。
正向型SnapShots可以用于要扫描多个记录并顺序处理(进行数值计算,复制所选记录到另一个表格中,等等)数据库记录的情况。
这个记录集不提供反向方法,所以间接成本少。
Tables型记录组可以用于调用数据库表格。
Tables比其他记录集类型的处理速度都快,可以保持表格与数据库中的数据同步,也可用于更新数据库。
但Table 只限于一个表格。
此外,通过Tables型记录集访问表格时,可以利用Tables的索引值进行快速查找。
数据集(Datasets)的概念1.基本概念数据集是一种离线了的缓存存储数据,它的结构和数据库一样,具有表格、行、列的一种层次结构,另外还包括了为数据集所定义的数据间的约束和关联关系。
用户可通过.NEt框架的命名空间(NameSpace)来创建和操作数据集。
用户可以通过一些诸如属性(properties)、集合(collections)这些标准的构成来了解Dataset这个概念。
如:(1)数据集(DataSet)包括数据表格的Tables这个集合以及relation的"Relations"集合。
(2)DataTable类包括了数据表格row的"Rows"集合,数据columns的"Column"集合,以及数据relation的"ChildRelations"和"ParentRelations"集合。
(3)DataRow类包括"RowState"属性,这些值是用来显示数据表格首次从数据库被加载后是否被修改过,这个属性的值可以为:"Deleted"、"Modified"、"New"以及"Unchanged"。
2.定义(Type)和未定义(Untyped)的数据集数据集有定型的和未定型的之分,定型的数据集是基本的DataSet类的一个子类,并且含有图表(.xsd文件),它用来描述数据集所拥有的表格的结构。
这些图表文件,包括了表的名字和列名、列所代表的数据的类型信息,以及数据间的约束关系。
而一个未定型的数据集则没有这些图表的描述。
在程序中用户可以使用任意两种类型的数据集,然而,定型的数据集可以使得用户对数据的操作更加明了,并且可以减少一些不必要的错误,定型的数据集可以生成一些对象模型,这些模型的第一层次的类(first-class)就是数据集所包含的表和列,假设用户正在对一个定型的数据集进行操作,则可以用如下的语法来指向一个列。
'指向表titles第一行的title_id列s=dsPub1.titles(0).title_id但是如果用户是在操作一个未定型的数据集的话,就需要这样编写代码了:'指向表titles第一行的title_id列s=dsPubs1.Tables("titles")(0).Columns(title_id")使用定型类不但可以使代码编制起来更加容易,而且,这种定型类的语法还为用户提供了检查代码正确与否的功能,减少了在指向数据集成员值时代码的错误率。
3.关系表(Related Tables)和关系对象(Related Objects)如果数据集中包含了多张表,这些表之间可能具有相关联的关系,然而,数据集不象数据库,它并没有关于关联关系的相关信息,所以当用户在处理关系表的时候,可以创建一些关联(relations)来描述这些在数据集中各个表之间的关联关系。
关联关系可以通过一些代码,人为地从父行(parent rows)到相关的子行(child rows)。
或者从子行再返回到父行。
例如,下面这个关于学校课程设置的例子,有一个关于教师的一个表格,如下表:其中数据集中可能还包括另一张关于课程信息的表,这张表包括了教师的ID,并把它作为一个外约束键(foreign key),如下表:因为每个老师不可能只教一门课,所以在课程描述表和教员表之间就存在一种一对多的关系。
举一个例子,假设教师i777(李四)教2门课,则可以用数据的关联(data relations)把一个数据表的某个特指的行指向另外一个数据表的一个列,这样就可以在这两个表之间双向地进行查询导航,例如,用户可以从一行描述张三教师的行,浏览到描述它教的课这一行,反之,也可以从描述课程Science999(生物)的行浏览到描述教这门课的教师张三的这一行。
4.更新数据集和数据存储当用户改变数据集中的数据时,这些改变将要被重新写回到数据库中,类"DataRow"是用来对单独的记录进行操作的,其中它包括属性"RowState",它的值是用来表示自从数据从数据库中第一次被调用以后,行是怎样变化的,该属性的值可以为:"Deleted"、"Modified"、"New"以及"Unchanged"。
为了把这些数据集的变化写回到数据库中,用户可以调用方法"Update",这个方法将会访问"RowState"的属性值,并且决定怎样对数据库进行一系列的操作,如add,edit,delete,将都会被运行。
什么是daoDAO可以访问本地的和远程的数据源。
如果数据源是本地的或客户端的,DAO通过Jet引擎来访问数据;如果数据源是远程的或ODBC驱动的话,最新的DAO3.6通过ODBCDirect来访问。
注意:其实ODBCDirect是一个使用DAO名字的RDO,当使用ODBCDirect时,DAO 装的不是Microsoft Jet数据库引擎,而是装载RDO2.0。
随着ADO的推出,DAO的优点就再也体现不出来了,因此在不久的将来,DAO将逐渐退出历史舞台。
但是,作为一项成熟的技术,DAO曾经得到了广泛的使用,在一段时间内,DAO的用户仍然会有大量的存在。
总的来说,开发者可以在如下几种情况下使用DAO。
(1)应用系统使用的是本地数据库,如Microsoft Foxpro和Microsoft Access 等。
(2)用户已经对DAO非常精通,但还没有时间学习ODBC或ADO。
(3)用户需要对一个原有的系统进行修改,而原有的系统采用的是DAO,且规模较大,把它移植成ADO需要大量的时间和金钱。
DAO把后台数据源的具体技术细节隐藏起来,开发人员不用考虑不同数据库系统的差异。
例如,下面的代码能够工作在任何类型的数据源上:............Dao与Jet数据库引擎DAO可以访问本地数据库和远程数据库。
这里指的本地和远程并不是地理位置上的概念,它们是两个逻辑概念。
本地数据库可以在本地计算机(物理)上,也可以不在本地计算机上,而远程计算机也并不局限于远程计算机(物理)上。
本地数据库是通过文件系统访问的数据库,它可以放在本地计算机上,也可以放在网络上,它由应用程序直接操作。
而远程数据库只能由DBMS操作,应用程序对它的访问通过DBMS来完成,这样就产生了Client/Server体系结构,应用程序是Client端,DBMS是Server端。
Microsoft Jet是Microsoft Access和Visual Basic使用的一种数据库引擎。
在DAO3.1版本以前,DAO被定义为“Microsoft Jet引擎的编程接口”,也就是说,DAO和Jet在历史上几乎是同义词。
DAO访问数据库都要通过Microsoft Jet 数据库引擎来完成。
当然,这两个概念在内涵上是不一样的,Jet不能被直接使用,只有通过DAO或Access才能直接使用Jet.但是,DAO3.1之后增加了一项重要的功能,这就是ODBCDirect访问。
ODBCDirect 使得DAO可以跳过Jet引擎,直接访问ODBC数据源。
正是由于有了这项功能,DAO不再绑定在Jet上了,DAO与Jet仍有千丝万缕的联系。
一般来说,如果应用程序使用的是本地数据库,那么DAO一般都通过Jet来访问数据库,反之,如果使用的是远程数据库,那么DAO通过ODBCDirect来访问数据库。