数据库设计完成后,就可通过用户界面或编程语言创建数据库。您可能还希望将已存在的表加入数据库,使它们也能享受到 Visual FoxPro 数据字典提供的各种功能。如果您已经在“项目管理器”中打开了一个项目,新创建的表将自动加入到该项目中。
有关创建多用户环境数据库的详细内容,请参阅第十七章“共享访问程序设计”。
本章内容要点:
创建数据库实际上就是将多个表收集到一个集合中,在这里,它们可以享受到数据字典的各种功能。
数据字典使得对数据库的设计和修改更加灵活。使用数据字典,可以设置字段级和记录级的有效性检查,保证主关键字字段内容的唯一性,如果不用数据字典,这些功能就都必须由您自己编程实现。Visual FoxPro 数据字典可创建和指定:
一些数据词典的功能(例如长字段名、主关键字、候选关键字、默认值、字段级和记录级规则及触发器)存储在 .DBC 文件中,在创建表或视图的过程中创建。有关这些功能的详细内容,请参阅第七章“处理表”和第八章“创建视图”。
为把表收集入数据库,需创建一个数据库容器以容纳所有与组成数据库的表相关联的对象。如:视图、连接和存储过程。
若要创建一个新数据库
– 或者 –
下面的代码创建并以独占方式打开了一个叫做 Sample
的新数据库。
CREATE DATABASE Sample
一个新的数据库创建好之后,里面是空的,没有包含任何相关表或其他对象。向数据库中添加表实际上是建立表文件与数据库容器之间的双向链接关系:在数据库中保存指向表文件的前链,在表中保存指向数据库容器的后链。
连接指定数据库容器与表之间的关联
您可以用下面的命令和函数以编程方式对数据库及其对象进行操作。
操作数据库及数据库对象的命令和函数
每个 Visual FoxPro 的表可以有两种存在状态:自由表(即没有和任何数据库关联的 .DBF 文件)或者数据库表(即与数据库关联的 .dbf文件)。和数据库关联的表可以具有自由表所没有的属性,例如字段级规则和记录级规则、触发器和永久关系等。
您可以在一个打开的数据库中创建表,或向数据库中添加已有的表,把表和数据库联系起来。有关创建新表的内容,请参阅第七章“处理表”。
若要在数据库中添加一个自由表
例如,下面的代码打开 testdata
数据库,并向其中添加 orditems
表:
OPEN DATABASE testdata
ADD TABLE orditems
只有明确地把一个已有的自由表添加到数据库中,才能使它成为数据库的一部分。即使在打开数据库后,执行 MODIFY STRUCTURE 命令修改自由表的结构,也不能使 Visual FoxPro 把自由表添加到数据库中。
一个表只能加入到一个数据库中。但是,即便不把一个表加到数据库中,您仍可以使用该 .dbf 文件的数据。
若要访问其他数据库中的表
使用“!”符号可以引用一个不在当前数据库中的表。例如,如果想浏览 testdata
数据库中的 orditem
表,可键入:
USE testdata!orditems
BROWSE
对于前面这个示例,使用 USE 命令时,自动打开 testdata
数据库,但 Visual FoxPro 并不把 testdata
设成当前数据库。当关闭表时,除非在表关闭之前已显式地打开该数据库,否则(如前例)自动打开的数据库会自动关闭。
有关使用视图访问数据库外部信息的详细内容,请参阅第八章“创建视图”。
当您把一个表添加到数据库中时,Visual FoxPro 将修改此表文件的头记录,记录拥有此表的数据库的路径和文件名。这个路径和文件名信息称作“后链”,因为它把该表连向拥有该表的数据库。因此,从数据库中移去表时,不仅要从数据库文件中移去表及有关的数据字典信息,同时也要更新后链信息,以反映表变成自由表的新状态。
您可以通过交互方式或使用 REMOVE TABLE 命令从数据库中移去表。从数据库移去表时,还可以选择是否从磁盘上永久删除该表文件。
若要从数据库中移去表
– 或者 –
– 或者 –
例如,下面的代码打开了 testdata
数据库并移去 orditems
表:
OPEN DATABASE testdata
REMOVE TABLE orditems
从数据库中移去表不能自动删除该表文件。如果想要从数据库中移去表,同时从磁盘上删除该表的 .dbf 文件,请使用 REMOVE TABLE 命令的 DELETE 子句或 DROP TABLE 命令。例如,以下代码打开 testdat
数据库,从盘上删除 orditems
表:
OPEN DATABASE testdata
REMOVE TABLE orditems DELETE
以下代码也打开 testdat
数据库,从盘上删除 orditems
表,但不在
Windows 回收站中保存副本。
OPEN DATABASE testdata
DROP TABLE orditems NORECYCLE
如果您移动了数据文件(.dbc、.dct 和 .dcx)或与数据库关联的表文件,则这些文件的相对路径会改变,可能会破坏 Visual FoxPro 关联数据库和表文件的双向链接。
链接被破坏后,可重建链接,更新相对路径信息以反映文件的新位置。
在移动表或数据库后更新链接
例如,以下代码打开 testdata
数据库,并显示对话框,在对话框中您可以重新定位那些移动了位置的文件。
OPEN DATABASE testdata
VALIDATE DATABASE RECOVER
提示 链接被破坏后,若要使用表而不想花时间重建数据库所有表的链接,可用 USE 命令打开表。Visual FoxPro 会显示“打开”对话框,允许您重新定位该表所属的数据库或删除链接(使表成为自由表)。
有关偶然删除表中所属数据后,从表中移去后链的详细内容,请参阅 FREE TABLE。
可在数据库中创建表间的永久关系。永久关系是数据库表间的关系,它们存储在数据库文件中,并且:
和使用 SET RELATION 命令创建的临时关系不同,永久关系不必在每次使用表时重新创建。可是,由于永久关系并不控制各表内记录指针间的关系(使用永久关系不能实现在一个表中移动记录指针,而改变另一个表中的指针),因此在开发 Visual FoxPro 应用程序时,您可能既要使用临时的 SET RELATION 关系,又要使用永久关系。
在 Visual FoxPro 中,可使用索引在数据库中建立表间的永久关系。之所以在索引间创建永久关系,而不是字段间的永久关系,是因为这样可以根据简单的索引表达式或复杂的索引表达式联系表。
若要创建表间的永久关系
– 或者 –
例如,下面的命令根据 customer
表的主关键字 cust_id
,添加了 customer
和 orders
表之间的一对多关系,并在 orders
表中添加了一个新的外部关键字,cust_id
:
ALTER TABLE orders;
ADD FOREIGN KEY cust_id TAG ;
cust_id REFERENCES customer
然后,在“数据库设计器”中查看该数据库的分层结构,就会看到 orders
和 customer
之间有一条连线,这表示新的永久关系。
基于索引的永久关系
索引关键字(或标识)的类型决定了要创建的永久关系类型。在一对多关系中,“一方”必须用主索引关键字(或标识),或者用候选索引关键字(或标识);在“多方”则使用普通索引关键字(或普通索引标识)。有关索引类型和创建索引的详细内容,请参阅第七章“处理表”。
若要删除表间的永久关系
关系线变粗,表明已选择了该关系。
– 或者 –
在 ALTER TABLE 命令中,使用 DROP FOREIGN KEY 子句。
例如,下面的命令删除了表 customer
和表 orders
之间的一个永久关系,这个关系基于 customer
表的主关键字 cust_id
和 orders
表的外部关键字 cust_id
:
ALTER TABLE orders DROP FOREIGN KEY TAG cust_id SAVE
建立参照完整性涉及到生成一系列规则,以便在输入或删除记录时,能保持已定义的表间关系。
如果实施参照完整性规则,Visual FoxPro 可以确保:
您也可以编写自己的触发器和存储过程代码来实施参照完整性。Visual FoxPro 参照完整性生成器 (RI) 可以帮助您确定要实施的规则类型、要实施规则的表以及会导致 Visual FoxPro 检查参照完整性规则的系统事件。
RI 生成器是可处理级联删除和级联更新的一个工具,建议您用它建立参照完整性。
若要打开 RI 生成器
当您使用 RI 生成器为数据库生成规则时,Visual FoxPro 把生成的代码作为触发器保存在存储过程中。打开存储过程的文本编辑器,可显示这些代码。有关用编程方式创建触发器的内容,请参阅第七章“处理表”中的“使用触发器”。
注意 当更改数据库的设计之后(例如,修改了数据库表或改变了在永久关系中使用的索引),那么应该在使用数据库之前,重新运行 RI 生成器,这样将修改存储过程代码和那些实施参照完整性的表触发器,从而反映新设计的变化情况。如果不重新运行 RI 生成器,您可能会得到意想不到的结果。因为存储过程和触发器并没有重写,因而不能反映设计上的更改。
您可以为数据库中的表创建存储过程。存储过程是存储在 .dbc 文件中的 Visual FoxPro 代码,是专门操作数据库中数据的代码过程。存储过程可以提高数据库的性能,因为在打开一个数据库时,它们便加载到了内存中。
若要创建、修改或移去存储过程
– 或者 –
– 或者 –
这几种方法都将打开 Visual FoxPro 文本编辑器,帮助您创建或修改当前数据库的存储过程。
使用存储过程主要是为了创建用户自定义函数,字段级规则和记录级规则将引用这些函数。当把一个用户自定义函数作为存储过程保存在数据库中时,函数的代码保存在 .dbc 文件中,并且在移动数据库时,会自动随数据库移动。使用存储过程能使应用程序更容易管理,因为可以不必在数据库文件之外管理用户自定义函数。
每个 Visual FoxPro 数据库都包括了 Comment 和 Version 属性。用 DBGETPROP( ) 和 DBSETPROP( ) 函数可查看和设置这些属性。
例如,下面的代码显示 testdata
数据库的版本号:
? DBGETPROP('testdata', 'database', 'version')
返回值表示 Visual FoxPro .DBC 的版本号,它是只读的。若数据有注释,可用同样的函数查看:
? DBGETPROP('testdata', 'database', 'comment')
与 Version 属性不同,Comment 属性即可读又可写。用 DBSETPROP( ) 函数输入描述或其他要存储在数据库中的文本。
若要设置当前数据库的注释属性
– 或者 –
例如,下面的代码为 testdata
数据库更改注释:
? DBSETPROP('testdata', 'database', 'comment', ;
'TestData is included with Visual FoxPro')
也可以对其他数据库对象(例如远程数据连接和视图)使用 DBGETPROP( ) 和 DBSETPROP( ) 函数,来查看属性和设置属性。
创建一个数据库时,Visual FoxPro 建立并以独占方式打开一个 .dbc(数据库容器)文件,此 .dbc 文件存储了有关该数据库的所有信息(包括和它关联的文件名和对象名)。.dbc 文件并不在物理上包含任何附属对象(例如表或字段),相反,Visual FoxPro 仅在 .dbc 文件中存储指向表文件的路径指针。
要了解数据库的组织结构,您可以浏览数据库文件,查看规划,浏览数据库对象,检查数据库有效性,甚至可以扩展 .dbc 数据库文件。
数据库规划是在数据库中所建立的表结构和永久关系的可视化表示形式。“数据库设计器”窗口可显示已打开数据库的分层结构。
若要显示数据库分层结构
例如,下面的代码打开 testdata
数据库,并在“数据库设计器”中显示其分层结构:
MODIFY DATABASE testdata
数据库略图是对数据库中对象的描述
在“数据库设计器”中,使用“数据库”工具栏可以做到:创建新表、把已有的表添加到数据库中、从数据库中移去表、修改表的结构,还可以编辑存储过程。
数据库文件为和数据库关联的每个表、视图、索引、标识、永久关系以及连接保存了一个记录,也保存了每个具有附加属性的表字段或视图字段的记录。此外,它还包含一个单独的记录,保存数据库的所有存储过程。
有关.dbc 文件结构的详细内容,请参阅“表文件的结构”.
“数据库设计器”只显示了数据库的规划,有时可能需要浏览数据库文件本身的内容。这时,可对 .dbc 文件发出 USE 命令,来浏览一个关闭状态的数据库。下面的示例打开“浏览”窗口,然后以表的形式显示 sales
数据库的内容。
CLOSE DATABASE sales
USE sales.dbc EXCLUSIVE
BROWSE
注意 除非您对 .DBC 文件的结构非常了解,否则不要使用 BROWSE 命令改变数据库文件。如果在改变 .dbc 文件时出了错,就会使数据库无效,并可能丢失数据。
每个 .dbc 文件包含一个备注字段(命名为 User),可用来保存您自己的有关数据库中每个记录的信息。为适应开发者的需要,也可以扩展 .dbc 文件,添加字段。字段必须加在库结构的末尾。要修改 .dbc 文件的结构,必须以独占方式访问它。
若要在 .DBC 文件中添加一个字段
例如,下面的代码打开“表设计器”,然后在 Testdata.dbc 结构中添加字段:
USE TESTDATA.DBC EXCLUSIVE
MODIFY STRUCTURE
向数据库文件中添加一个新字段并对其命名时,请用“U”打头,指明它是一个用户自定义字段。这样可以防止您的字段和 .dbc 文件将来的任何扩展发生冲突。
注意 不要更改 .dbc 文件中任何已存在的 Visual FoxPro 定义字段,对 .dbc 文件所做的任何改动都可能影响到数据库的完整性。
检查数据库,以确定数据库每个记录都与它所代表的数据库中表和对象准确对应。您可以用 VALIDATE DATABASE 命令检查当前数据库的完整性。
若要检查数据库
例如,下面的代码打开并检查 testdata
数据库的 .dbc 文件:
OPEN DATABASE testdata EXCLUSIVE
VALIDATE DATABASE
数据库创建后,若还不是项目的一部分,您可以把它加入到项目中。若该数据库已是项目的一部分,可将它从项目中移走。若不再需要此数据库,也可将它从盘上删除。
“项目管理器”中的数据库
当使用 CREATE DATABASE 命令创建数据库时,即使“项目管理器”是打开的,该数据库也不会自动成为项目的一部分。可以把数据库添加到一个项目中,这样能通过交互式用户界面更方便地组织、查看和操作数据库对象,同时还能简化连编应用程序的过程。要把数据库添加到项目中,只能通过“项目管理器”来实现。
若要把数据库添加到项目中
要从项目中移去数据库,也只能通过“项目管理器”来实现。
若要从项目中移去数据库
可使用“项目管理器”或 DELETE DATABASE 命令从磁盘上删除数据库。
若要删除数据库
– 或者 –
例如,下面的代码删除了 sample
数据库:
DELETE DATABASE sample
要从磁盘上删除数据库,请使用上面两种方法之一。使用“项目管理器”或 DELETE DATABASE 命令都能使 Visual FoxPro 从数据库的表中移去指向该数据库的后链,其他文件实用工具(例如 Windows 文件管理器)则不能移去这些后链。
注释 DELETE DATABASE 命令并没有从磁盘上删除和数据库有关联的表,而只是把和数据库有关的表变成自由表。如果想从磁盘上删除数据库及所有关联的表,请在 DELETE DATABASE 命令中使用 DELETE TABLES 子句。
为符合多用户环境的数据组织需要,您可以同时使用多个数据库。同时使用多个数据库有以下优点:
例如,您有一个包含销售信息的销售数据库,主要用于销售部门处理顾客方面的信息。另一个包含货物信息的数据库,主要用于采购部门处理供应商方面的信息。有时不同部门对信息的需求会重叠。这些数据库可同时打开,随意访问,但它们包含着不同类的信息。
多数据库可增加系统灵活性
可通过同时打开多个数据库,或引用关闭的数据库中的文件,使用多数据库。一旦打开多个数据库,可设置当前数据库,并选择其中的表。
打开一个数据库后,表和表之间的关系就由存储在该数据库中的信息来控制。您可以同时打开多个数据库。例如,在运行多个应用程序时,可以使用多个打开的数据库,每个应用程序都以不同的数据库为基础。也可能您想打开多个数据库,从而能使用应用程序数据库之外的另一数据库中的存储信息,例如自定义控件。
若要打开多个数据库
– 或者 –
打开新的数据库并不关闭其他已经打开的数据库,这些已打开的数据库仍然保持打开状态,而新打开的数据库成为当前数据库。
当打开多个数据库时,Visual FoxPro 将最后打开的数据库设置为当前数据库。所创建或添加到该数据库中的任何表或其他对象,均默认为当前数据库的一部分,处理打开数据库的命令和函数(例如 ADD TABLE 命令和 DBC( ) 函数)也是对当前数据库进行操作。
可通过交互方式或使用 SET DATABASE 命令选择另外一个数据库作为当前数据库。
若要设置当前数据库
– 或者 –
例如,下面的代码打开三个数据库,设置第一个数据库为当前数据库,然后使用 DBC( ) 函数显示当前数据库的名称:
OPEN DATABASE testdata
OPEN DATABASE tastrade
OPEN DATABASE sample
SET DATABASE TO testdata
? DBC( )
提示 当执行的查询或表单需要打开一个或多个数据库时,Visual FoxPro 可以自动打开这些数据库。为了保证您所处理的数据库是正确的数据库,最好在执行任何对当前数据库操作的命令前,明确设置当前数据库。
可以使用 USE 命令,在当前数据库的一系列表中选择要用到的表。
若要从当前数据库选择表
显示“使用”对话框后,选定并打开一个表。
例如,下面的代码打开了 sales
数据库,并提示您在数据库的一系列表中选定一个表:
OPEN DATABASE SALES
USE ?
如果您想选定一个与当前数据库不关联的表,可选择“使用”对话框中的“其他”按钮。
可以使用“项目管理器”或 CLOSE DATABASE 命令关闭一个已打开的数据库。
若要关闭数据库
例如,下面的代码关闭了 testdata
数据库:
SET DATABASE TO testdata
CLOSE DATABASE
这两种方法都自动关闭数据库,也可以使用 CLOSE 命令的 ALL 子句关闭数据库及所有其他已打开的对象。
如果用下面的方法打开一个数据库,那么在“命令”窗口执行 CLOSE DATABASE 命令时,不能关闭该数据库:
在这两种情况下,数据库将一直保持打开状态,直到“项目管理器”关闭该数据库,或者使用该数据库的表单关闭。
Visual FoxPro 把当前数据库作为命名对象(例如表)的主作用域。当打开一个数据库时,Visual FoxPro 首先在已打开的数据库中搜索所需的任何对象(例如表、视图、连接等)。只有在当前数据库中没有找到所需对象时,Visual FoxPro 才在默认的搜索路径上查找。
例如,如果 customer
表和 sales
数据库关联,那么当您执行下面的命令时,Visual FoxPro 总会在此数据库中找到 customer
表:
OPEN DATABASE SALES
ADD TABLE F:\SOURCE\CUSTOMER.DBF
USE CUSTOMER
如果执行下面的命令,Visual FoxPro 首先在当前数据库中查找 products
表:
USE PRODUCTS
如果 products
表不在当前数据库中,Visual FoxPro 会使用默认的搜索路径在数据库外查找。
注释 如果您希望在数据库的内部和外部都能访问一个表(例如,对于表的位置会改变的情况),可以为该表指定完整路径。但是只使用表名,速度会更快,因为 Visual FoxPro 对数据库表名的访问速度比完整路径快。
数据库错误,也称“引擎错误”,当记录级事件代码发生运行时刻错误时。例如,当用户将 null 值存入一个不允许为 null 值的字段时,产生数据库错误。
当对数据库非法操作时,位于底层的数据库引擎会检测到错误并提交一条出错信息。出错信息的具体内容与检测到该错误的数据库管理系统有关,例如,远程数据服务器(比如 Microsoft SQL Server)产生的错误信息可能不同于本地的 Visual FoxPro 所产生的错误信息。
另外,引擎级的错误信息通常都很笼统,因为数据引擎并不知道记录更新的具体环境。所以 Visual FoxPro 应用程序的最终用户不用太关心引擎级错误信息。
若要产生对应用程序而言更具有针对性的错误信息,可用 CREATE TRIGGER 命令创建触发器。触发器每当记录更新(删除,插入或更新)时便被触发。您在对触发事件进行编程时,可以捕获针对当前应用程序的错误,并报告出错信息。
若用触发器处理数据库错误,需打开缓冲器。这样,当更新记录时,触发器被触发,但记录不立即传送到底层的数据库引擎。因而可避免同时产生两个错误信息的可能:一个来自触发器,另一个来自底层的数据库引擎。
若要用触发器捕获自定义错误并报告出错信息