核心关闭命令
CLOSE DATABASES (关闭数据库和所有表)
这是最常用、也最安全的关闭命令之一。

-
功能:
- 关闭所有当前打开的数据库。
- 关闭所有在数据库中注册的自由表 和表。
- 释放所有工作区。
- 将 VFP 的默认数据库名称 设置为空。
-
语法:
CLOSE DATABASES [ALL]
-
[ALL]子选项:- 如果不使用
ALL,它只关闭当前数据库(如果存在)及其中的表,以及自由表。 - 如果使用
ALL,它会关闭所有打开的数据库、表和自由表,无论它们是否属于当前数据库,这是最彻底的关闭方式。
- 如果不使用
-
示例:
(图片来源网络,侵删)* 假设当前打开了数据库 'mydata.dbc' 和其中的 'customers.dbf', * 以及一个自由表 'temp.dbf' CLOSE DATABASES && 只关闭当前数据库 'mydata.dbc' 和其内的表,以及 'temp.dbf' * 如果之后又打开了另一个数据库 'sales.dbc',执行: CLOSE DATABASES ALL && 会关闭 'mydata.dbc', 'sales.dbc', 'customers.dbf', 'temp.dbf' 等所有
CLOSE TABLES (关闭表)
这个命令专门用于关闭表,但行为取决于是否在数据库上下文中运行。
-
功能:
- 在数据库中运行:关闭当前数据库中所有打开的表,但不关闭数据库本身。
- 在自由表环境下运行:关闭所有打开的自由表。
-
语法:
CLOSE TABLES [ALL]
-
[ALL]子选项:
(图片来源网络,侵删)- 如果不使用
ALL,它只关闭当前数据库中的表(如果存在)。 - 如果使用
ALL,它会关闭所有打开的表,无论它们是数据库表还是自由表。
- 如果不使用
-
示例:
* 假设当前打开了数据库 'mydata.dbc' 和其中的 'orders.dbf' CLOSE TABLES && 只关闭 'orders.dbf',但 'mydata.dbc' 仍然是打开状态 * 假设现在又打开了一个自由表 'log.dbf' CLOSE TABLES ALL && 会关闭 'orders.dbf' 和 'log.dbf',但 'mydata.dbc' 仍然是打开状态
USE 命令 (关闭当前工作区的表)
USE 命令主要用于在指定工作区打开一个表,但如果不带任何参数,它可以关闭当前工作区已打开的表。
-
功能:
- 关闭在当前选定工作区 中打开的表。
-
语法:
USE [IN <工作区号>] [IN <别名>] && 打开表 USE && 关闭当前工作区的表 USE IN <别名> && 关闭指定别名(工作区)的表
-
示例:
SELECT 0 && 选择一个空闲工作区 USE customers.dbf && 在新工作区打开 customers 表 SELECT customers && 选择 customers 表所在的工作区 USE && 关闭 customers 表 * 或者直接通过别名关闭 USE IN customers && 同样是关闭 customers 表
命令对比与选择指南
| 命令 | 主要功能 | 是否关闭数据库 | 是否关闭自由表 | 是否关闭数据库表 | 适用场景 |
|---|---|---|---|---|---|
CLOSE DATABASES |
关闭所有数据库和表 | 是 | 是 | 是 | 最常用、最推荐,当一个模块或程序结束时,彻底清理所有数据环境,防止资源泄漏和后续操作错误。 |
CLOSE DATABASES ALL |
关闭所有数据库和表 | 是 | 是 | 是 | 比 CLOSE DATABASES 更彻底,确保没有任何数据库或表被遗漏。 |
CLOSE TABLES |
只关闭表 | 否 | 是 | 是 | 当你只想刷新表数据,但希望保持数据库连接和结构(如存储过程、视图等)可用时,在重新索引前。 |
USE |
关闭单个工作区的表 | 否 | 是 | 是 | 精确控制,只想关闭某一个特定的表时,在循环中处理多个表时非常有用。 |
最佳实践与常见场景
场景1:程序结束时(推荐做法)
在每个程序或模块的末尾,使用 CLOSE DATABASES ALL 是一个非常好的习惯,它能确保所有打开的数据对象都被正确关闭,释放内存和资源,避免影响后续操作。
* --- myprogram.prg ---
LOCAL lcOldPath
lcOldPath = SET('DEFAULT')
SET DEFAULT TO (HOME() + 'mydata')
* 打开数据库和表
OPEN DATABASE salesdata
USE customers IN 0
USE orders IN 0
* ... 程序主要逻辑 ...
* --- 程序结束前清理 ---
CLOSE DATABASES ALL && <-- 强烈推荐
SET DEFAULT TO (lcOldPath)
RETURN
场景2:临时使用一个表,用完即关
如果你只是临时需要一个表的数据,处理完后希望不影响当前的数据环境,最佳实践是 SELECT 0 选择一个新工作区,处理完后用 USE IN <别名> 关闭它。
* --- 处理临时数据 --- LOCAL lnWorkArea lnWorkArea = SELECT() * 在一个空闲工作区打开临时表 SELECT 0 USE temp_report.dbf * ... 对 temp_report 进行操作 ... * 操作完成,关闭它 USE IN temp_report && 关闭,并释放其工作区 * 恢复原来的工作区 SELECT (lnWorkArea)
场景3:重新索引数据库中的所有表
这是一个 CLOSE TABLES 经典应用场景,你需要先关闭所有表,然后重新打开它们以应用新的索引或结构。
* 假设在 'mydata.dbc' 数据库上下文中运行 CLOSE TABLES && 关闭当前数据库中的所有表 * 现在可以安全地执行 REALL 命令来重建索引 DBREALL (lcDatabaseName) && 这是一个自定义函数,用于打开数据库中的每个表并执行 REINDEX
其他相关命令
CLEAR ALL:这是一个更“暴力”的命令,它不仅会关闭所有数据库和表,还会释放所有内存变量、数组、用户定义菜单和窗口等,通常只在应用程序完全退出前使用。SET DELETED ON:这不是关闭命令,但与数据处理紧密相关,它告诉 VFP 在执行大多数命令(如SUM,COUNT,LIST)时忽略已标记为删除的记录,在处理完需要逻辑删除的记录后,可以配合PACK物理删除它们,然后关闭表。
| 你的目标 | 推荐命令 |
|---|---|
| 彻底清理,程序结束 | CLOSE DATABASES ALL |
| 只刷新表,保持数据库连接 | CLOSE TABLES |
| 精确关闭某一个表 | USE IN <别名> |
| 临时使用一个表 | SELECT 0 ... USE IN <别名> |
对于初学者和大多数应用场景,CLOSE DATABASES (不带 ALL) 通常是安全且足够的选择,而在更健壮的程序设计中,CLOSE DATABASES ALL 是保证数据环境干净、避免冲突的黄金标准。
