VB数据库基础知识

上传人:d**** 文档编号:184376952 上传时间:2023-02-01 格式:DOCX 页数:10 大小:160.99KB
返回 下载 相关 举报
VB数据库基础知识_第1页
第1页 / 共10页
VB数据库基础知识_第2页
第2页 / 共10页
VB数据库基础知识_第3页
第3页 / 共10页
点击查看更多>>
资源描述
数据库基础知识几乎所有的商业应用程序都需要处理大量的数据,并将其组织成易于读取的格式。 这种要求通常可以通过数据库管理系统(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)。或者从子行再返回到父行。例如,下面这个关于学校课程设置的例子,有一个关于教师的一个表格,如下表:袭I教岬信题InstructorlDNameHi rt DaujU409闻 VI992iE4:二09W1/1983其中数据集中可能还包括另一张关于课程信息的表,这张表包括了教师的ID, 并把它作为一个外约束键(foreign key),如下表:饕7诔程侑驻DcpanmentCoarse NumberName加妙目然再学系生物iW百病科学素si1款值计算此因为每个老师不可能只教一门课,所以在课程描述表和教员表之间就存在一种一 对多的关系。举一个例子,假设教师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把后台数据源的具体技术细节隐藏起来,开发人员不用考虑不同数据库系统 的差异。例如,下面的代码能够工作在任何类型的数据源上:Do While Nat rs Dept&EOFpN a).nDepis.MoveNcxiLoopRsDerts.ClftseDao与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来访问数据库。Jet是通过SQL来驱动的,但是这种SQL可能和通常的实现不太一样。这种情况 下可能会带来好处,也有可能会带来坏处。当使用DAO访问数据库时就必须考虑 这种差别。因为Jet的SQL的运行和一些标准的SQL运行性能差异很大。考虑下 面这个SQL语句:SELECT * FROM Student,TeacherWHERE Student.Course_No=Teacher.Course_No在SQL SERVER中执行这个SQL语句时,SQLSERVER会在内部自动把Student表 和Teacher表使用的最优化方式连接起来,即用Student表的Course_No域的值 来索引Teacher表,因此,每读取一条Student记录,只需读一条Teacher记录, 整个语句的执行共需读取2*COUNT(Student)个记录。但是,同样是这个语句,通过DAO和Jet来执行时,Jet会把两个表进行笛卡尔 连接,然后再滤掉一些不合格条件的记录。这样一来,每读一条Student记录, 都必须读取所有的Teacher记录,即COUNT(Teacher)条Teacher记录,整个语 句的执行共需读取COUNT(Student)*COUNT(Teacher)条记录。如果这两个表的数 据庞大的话,这个语句的执行速度将令人不可忍受。Dao对象模型DAO提供了两种不同的对象模型,一种对象模型是通过Jet引擎来访问数据,如 下图所示。另一种对象模型是通过ODBCDirect来访问数据。这两种对象模型都 是层次结构的。现在分别对这两种对象模型进行介绍。DBEngine是一个基于对象,它包含了两个重要的集合(Collection), 一个是 Errors集合,另一个是Workspaces集合。对DAO的操作总会产生一些错误,每 产生一个错误,DAO就生成一个Error对象,这些Error对象都放在Errors集 合中,可以用Errors.Count来计算错误的个数。事实上,对于每一个集合,都 可以用Collection.Count来求出该集合中对象的个数。每一个应用程序只能有一个DBEngine对象,但可以有多个Workspace对象,这 些Workspace对象都包含在Workspace集合中。每个Workspace对象都包含了一 个Database对象对应了一个数据库,它里面包含了许多用于操作数据库的对象。 这些对象中,有一些是Jet数据库专用的,如Container、TableDef和Relation 对象,有一些则是对所有数据库都有用的,如Recordset对象和QueryDef对象。下面对对象模型中的主要对象进行详细的说明。1. DBEngine 对象DBEngine对象是惟一的,不能创建,也不能声明。通常,可以用DBEngine对象 的属性来设置数据库访问的安全性,即设置访问数据库缺省用户名和缺省口令, 如:Dim DbEn AS DAO.DBEngine二New DAO.DBEngine()DbEn.DefaultUser=RtLinux”DbEn.DefaultPassword=aaa”由于Jet数据库引擎允许用户定义一个工作组,对于工作组中的每一个用户可以 设置不同的数据库访问权限。必须把存储这个工作组有关信息的文件告诉DAO, 方法就是设置DBEngine对象的SystemDB属性,如:DbEn.SystemDB=C:&System.mdw当使用Jet数据库引擎时,必须把DBEngine对象的DefaultType属性设置为 dbUseJet”。DBEngine对象还提供了很多方法来操作工作区(Workspace)和数据库,如:Creat Workspace方法创建一个工作区,Creatdatabase创建一个数据库,OpenDatabase 打开一个数据库,CompactDatabase压缩一个数据库,RepairDatabase修复一个 数据库,等等。2. Error 对象Error对象是DBEngine对象的一个子对象。在发生数据库操作错误时,可以用 标准的VB的Err对象来进行错误处理,也可以把错误信息保存在DAO的Error 对象中。Error对象包含以下属性:(1) Description属性。这个属性包含了错误警告信息文本,如果没有进行错误 处理,这个文本将出现在屏幕上。(2) Number属性。这个属性包含了产生错误的错误号。(3) Source属性。这个属性包含了产生错误的对象名。(4) HelpFile属性和HelpContext属性。这两个属性设置有关这个错误的Windows 帮助文件和帮助主题。3. Workspace 对象一个Workspace对象定义一个数据库会话(Session) o会话描述出由Microsoft Jet完成的一系列功能,所有在会话期间的操作形成了一个事务范围,并服从于 由用户名和密码决定的权限。所有的Workspace对象组合在一起形成了一个 Workspace集合。可以用DBEngine对象的CreateWorkspace方法画创建一个新 的工作区,只需把工作区的名称和用户信息传递给这个方法,如:Dim wg ASrDAO.Wuikspets = dben.Workspaces(O)ws = dbcn,CikWoikspac,eCustomer AdmirT* |np5wrddbUseJei)dben, Work spaces Appcndtws注意:当创建了一个新的Workspace对象时,它并不会自动添加到Workspace 集合中,必须用Append方法把Workspace对象添加到Workspace集合中。4. Database 对象一旦用CreateDatabase创建了一个数据库或用OpenDatabase打开了一个数据库, 就生成了一个Database对象。所有的Database对象都自动添加到Database集 合中。下面的这段代码就是使用Database集合列出了所有的数据库的路径名:db二ws.OpenDatabase(txtMDBFile.text)Database对象有5个子集合,分别是Recordsets集合,QueryDefs集合, TableDefs集合,Relation集合和Containers集合,这些集合分别是Recordset 对象、QueryDef对象、TableDef对象、Relation对象和Container对象的集合。 Database对象提供一些方法来操纵数据库和创建这些对象。(1) Execute方法。执行一个SQL语句。这个SQL语句不仅可以操作数据库中的 数据,还可以是DLL,用来修改数据库的结构。(2) OpenRecordset方法。在数据库中执行一个查询,查询可能涉及到表的连接, 查询的结果作为一个Recordset对象返回。(3) CreateQuery方法。在数据库中创建一个存储过程并创建一个QueryDef对象。(4) CreateRelation方法。创建一个Relation对象,定义两个TableDef或 QueryDef之间的关系。(5) CreatTableDef方法。在数据库中创建一个数据表,并返回一个TableDef对 象。5. Recordset 对象Recordset对象是使用最频繁的一个对象,它代表了数据库中一个表或一个查询 结果的记录等。例如下面的语句在数据库的第一表中添加一条记录:For Each tempdb In Workspace(0).DatabasesDebug.Write(databases(x).Name=,temdb.Name)Next还可以在Recordset中任意移动当前的记录的位置,使用的是Recordset对象 MoveNext、MovePrevious、MoveFirst 和 MoveLast 方法。Recordset对象中还包含另一个对象-Field对象,这个对象代表了数据表的一 个字段,用这个对象可以访问数据表中的任何一个字段,如:下面的语句把表中 当前记录的Name字段值赋给变量sName:Dim db As DAO.Database二ws.OpenDatabase(user,aaa)SName二CStr(db.recordsets(0).Fields(name).value)Source参数可以是一个表名,也可以是一个查询的名字,还可以是一个用来创 建Recordset对象的SQL语句。这个参数是必须的,而其他的三个参数是可选的。 Type参数是指Recordset的类型,这里有必要说明一下Dynaset (动态集)和 Snapshot (快照)之间的区别。Dynaset这种Recordset对象的功能强大,使用 灵活,当Recordset被创建时,只有每个记录的主键被取到且被缓存在本地,由 于主键的大小总是小于整条记录的大小,所以Dynaset创建的速度很快。在 Dynaset创建以后,如果要查询记录,则用缓存的主键来进行查询。相反, Snapshot则是把整条记录都取出来存在本地,因此速度很慢,而且,如果别的 用户修改了数据库,本用户将无法看到这种改变。6. TableDef 对象TableDef对象也是一个经常使用的对象,它有两个子对象:一个是Field对象, 另一个是Index对象。用TableDef对象可以访问单个表的每个字段(Field对 象)和表的索引(Index对象)TableDef对象的一个重要的方法是CreateField。 CreatField方法用来在表中创建一个新的字段,它的语法为:Field二tabledef.CreateField(fieldname,fieldtype,fieldlength)三个参数分别指明新增字段的字段名,字段类型和字段长度。对于动态地创建一个新表或动态地修改表的结构时,这个对象是必不可少的。例 如下面的语句创建一个只有字段的新表:Dim db As DAO.Database: = ws.OpeftDaiatiasefc:FirstTest.mdb11R(LinuxtTdf理 db. CreateT北mDeRFeacher)Hd.Defaii1tVa)ue=ltMikeplid Fields. Append tidD b .TableDefs. Append rdfDbrtlose7. QueryDef 对象QueryDef对象用来定义一个查询。它有两个对象:一个是Field对象,一个是 Parameter 对象。用 Database 对象的 CreateQueryDef 方法来创建一个 QueryDef 对象。用户可以在Jet对象模型中这样使用QueryDef对象:(1) 用QueryDef对象的SQL属性来设置或返回查询的SQL语句的定义;(2) 用QueryDef对象的子对象Parameter来设置或返回查询定义的参数;(3) 用QueryDef对象的Type属性来设置查询的类型,查询的类型包括:从已有 的表中取出记录、创建一个新表、把一个表中的记录插入到另一个表中、删除记 录、更新记录等;(4) 用对象的MaxRecords属性来限制查询返回的记录数;(5) 用对象的ReturnRecords属性取得查询返回的记录数;(6) 用对象的Execute方法来执行查询;(7) 对象的RecordsAffected属性来返回此查询的所影响的记录数;(8) 用对象ODBTimeout来设置查询ODBC数据源时花费的最长时间;(9) 用对象的connect属性来连接ODBC数据源进行查询;(10)用对象的OpenRecordset方法来返回Recordset对象,并用此recordset 对象来取得查询的结果。8. Relation 对象Relation对象用来定义不同的表中或不同查询中字段之间的关系。例如,定义 一个表中的主键为另一个表的外键,定义一个表中的字段之间的一对一或一对多 的关系等等。用Database对象的CreateRelation方法来创建一个Relation对 象。9. Field 对象Field对象是Jet对象模型中的最底层的对象,它代表了一个表中的一个字段。 可以设置字段的各种属性,如字段类型(Type属性)、字段长度(Size属性)、 当前记录中字段的值(Value属性)、字段的缺省值(DefaultValue属性)、字 段是否可以为空(Required属性)等等。10. Group对象和User对象User对象代表了数据库的一个用户,Group对象则包含了具有相同权限的一组用 户。可以用这两个对象来管理数据库的用户。下面给出了一个函数来创建用户, 使用这个函数时,必需具有创建用户的权限。ODBCDirect是一种不用加载Microsoft Jet数据库引擎就可以操作ODBC数据库 服务器的技术。它是DAO3.5之后才增加的新特性ODBCDirect提供了一种机制, 使得DAO能把基于Jet的访问变为基于RDO的访问方法。但是,ODBCDirect并 不能完全替代RDO。要在应用程序中使用ODBCDirect来访问数据库,只需要把 下面这些话添加到应用程序的开始就可以了(任何使用DAO之前): DbEngine.DefaultType二dbUseODBC也可以在CreateWorkspace方法中指定dbUserODBC参数来使用ODBCDirect o如: Dim wrkODBC as dao.Workspace=new dao.Workspaces(0)Set wrkODBC二CreateWorkspace(ODBCWorkspace,admin,dbUseODBC) 使用ODBCDirect的DAO对象模型和Jet对象模型大同小异,模型的层次结构图 如下:与Jet对象模型相比,ODBCDirect去掉了用于数据库定义的对象,如TableDef 对象和Relation对象,但是新增Connection对象。Connection对象代表了和 ODBC数据源的一个连接。一般用OpenConnect方法来建立一个连接并创建一个 Connection 对象。OpenConnection 的语法如下:conection=workspace.Openconnection(name,options,readonly,connect)四个参数的含义和OpenDatabase方法的四个参数的含义一样,在此就不再赘述 了。请参阅前面讲过的Opendatabase方法。使用ODBCDirect操作ODBC数据源有如下一些优点:(1) ODBCDirect通过提供对ODBC数据源的直接访问,使程序代码执行得更快、 效率更高。因为它不需要加载Microsoft Jet数据库引擎,所以在客户端只需消 耗较少的资源。ODBC服务器可以响应所有的查询处理。(2) ODBCDirect提供对特定服务器进行访问的功能,这些访问是Microsoft Jet 使用ODBCA无法实现的。例如,对于支持光标集的服务器,ODBCDirect允许用 户指定光标集位置是在本地还是在服务器上。此外,也可以通过指定输入值以及 检查返回值,来与服务器级别的存储过程进行交互,这在Microsoft Jet中是不 可以的。(3) ODBCDirect支持数据的批量更新,可以将Recordset对象在本地的更改存入 高速缓存,然后批理向服务器导出这些更改。(4) 使用ODBCDirect,既可以创建简单的无游标集的结果集,也可以创建复杂的 游标集。它也可以执行返回多个结果集的查询,或是限制返回的行数,并监视所 有远程数据源生成的信息和错误,并不影响查询的执行性能。但是,ODBCDirect也有一些缺点。下面的一些功能就是ODBCDirect无法完成的, 但是Microsoft Jet能够完成的。(1) 可更新的连接。只有使用Microsoft Jet工作区才能更新基于多表连接的 Recordset对象中的数据。(2) 异种连接。只有使用Microsoft Jet工作区才能执行不同数据源种的表连接。(3) 数据定义语言(DDL)的操作。只有使用Microsoft Jet工作区才能通过Dao 进行DDL操作。ODBCDirect不提供TableDef对象,所以不能使用DAO来创建或 修改表。不过,使用ODBCDirect可以通过执行SQL DDL语句来执行DDL操作。(4) 窗体和控件结合。如果应用程序需要将ODBC数据源种的数据与窗体相结合, 就必须使用Microsoft Jet,在ODBCDirect工作区中访问的数据不能与窗体或 控件结合。如果应用程序不需要上述功能,就可以使用ODBCDirecto注意:可以在应用程序中同是定义Microsoft Jet和ODBCDirect工作区,并通 过各种形式将它们组合起来。例如,在同一个函数中,可以定义Microsoft Jet 工作区来使用DAO执行DDL操作,同时也可以定义ODBCDirect工作区来执行异 步查询。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 毕设全套


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!