菜鸟科技网

VFP关闭表命令有哪些?如何正确使用?

核心关闭命令

CLOSE DATABASES (关闭数据库和所有表)

这是最常用、也最安全的关闭命令之一。

VFP关闭表命令有哪些?如何正确使用?-图1
(图片来源网络,侵删)
  • 功能

    • 关闭所有当前打开的数据库
    • 关闭所有在数据库中注册的自由表
    • 释放所有工作区。
    • 将 VFP 的默认数据库名称 设置为空。
  • 语法

    CLOSE DATABASES [ALL]
  • [ALL] 子选项:

    • 如果不使用 ALL,它只关闭当前数据库(如果存在)及其中的表,以及自由表。
    • 如果使用 ALL,它会关闭所有打开的数据库、表和自由表,无论它们是否属于当前数据库,这是最彻底的关闭方式。
  • 示例

    VFP关闭表命令有哪些?如何正确使用?-图2
    (图片来源网络,侵删)
    * 假设当前打开了数据库 '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] 子选项:

    VFP关闭表命令有哪些?如何正确使用?-图3
    (图片来源网络,侵删)
    • 如果不使用 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 是保证数据环境干净、避免冲突的黄金标准。

分享:
扫描分享到社交APP
上一篇
下一篇