如何备份/导出Access数据库设置及获取GetOption完整选项名?
如何动态获取并导出Access「当前数据库」的完整设置
我之前在做Access数据库版本控制的时候,也遇到过一模一样的痛点——MSDN文档里的Application.GetOption参数列表不全,没法覆盖「文件-选项-当前数据库」里的所有设置。后来摸索出了几个基于动态获取的方案,完美解决了硬编码的问题,还能把所有配置导出成文本用于SVN跟踪:
方案1:通过系统表MSysOptions动态获取所有选项
Access的隐藏系统表MSysOptions存储了几乎所有数据库级的配置项,包括「当前数据库」里的每一项设置。哪怕这个表默认是隐藏的,我们也可以通过VBA的DAO对象直接访问,不用手动开启系统对象显示。
导出配置的VBA代码示例
Sub ExportCurrentDbSettings() Dim db As DAO.Database Dim rs As DAO.Recordset Dim outputPath As String Dim fso As Object Dim outputFile As Object Dim optionName As String Dim optionValue As Variant Dim optionType As Integer ' 设置导出文件路径(可根据你的需求调整) outputPath = CurrentProject.Path & "\CurrentDb_Settings.txt" ' 创建文件系统对象 Set fso = CreateObject("Scripting.FileSystemObject") Set outputFile = fso.CreateTextFile(outputPath, True, True) ' 第三个参数True表示UTF-8编码 Set db = CurrentDb ' 打开MSysOptions表,过滤出当前数据库相关配置(可按需调整WHERE条件) Set rs = db.OpenRecordset("SELECT Name, Value, Type, ReadOnly FROM MSysOptions WHERE Category = 'Current Database' OR Category IS NULL", dbOpenSnapshot) If Not rs.EOF Then rs.MoveFirst Do Until rs.EOF optionName = rs!Name optionType = rs!Type ' 根据类型处理值,避免导出格式混乱 Select Case optionType Case 1 ' 布尔型 optionValue = IIf(rs!Value, "True", "False") Case 2 ' 字符串型 optionValue = """" & rs!Value & """" ' 用引号包裹,避免空格/特殊字符问题 Case 3, 4 ' 数值型 optionValue = rs!Value Case Else optionValue = rs!Value End Select ' 写入文件,格式:选项名=值(标记只读项) Dim readOnlyTag As String readOnlyTag = IIf(rs!ReadOnly, " [只读]", "") outputFile.WriteLine optionName & readOnlyTag & "=" & optionValue rs.MoveNext Loop End If ' 清理资源 rs.Close outputFile.Close Set rs = Nothing Set db = Nothing Set outputFile = Nothing Set fso = Nothing MsgBox "当前数据库设置已成功导出到:" & outputPath, vbInformation End Sub
导入配置的VBA代码示例(用于还原设置)
Sub ImportCurrentDbSettings() Dim inputPath As String Dim fso As Object Dim inputFile As Object Dim lineText As String Dim splitArr As Variant Dim optionName As String Dim optionValue As String inputPath = CurrentProject.Path & "\CurrentDb_Settings.txt" Set fso = CreateObject("Scripting.FileSystemObject") If Not fso.FileExists(inputPath) Then MsgBox "配置文件不存在!", vbExclamation Exit Sub End If Set inputFile = fso.OpenTextFile(inputPath, 1, False, -1) ' -1表示UTF-8编码 Do Until inputFile.AtEndOfStream lineText = Trim(inputFile.ReadLine) If lineText <> "" And InStr(lineText, "=") > 0 Then ' 去除只读标记 lineText = Replace(lineText, " [只读]", "") splitArr = Split(lineText, "=", 2) optionName = Trim(splitArr(0)) optionValue = Trim(splitArr(1)) ' 还原值的类型 If optionValue = "True" Then Application.SetOption optionName, True ElseIf optionValue = "False" Then Application.SetOption optionName, False ElseIf Left(optionValue, 1) = """" And Right(optionValue, 1) = """" Then Application.SetOption optionName, Mid(optionValue, 2, Len(optionValue) - 2) ElseIf IsNumeric(optionValue) Then Application.SetOption optionName, CDbl(optionValue) Else Application.SetOption optionName, optionValue End If End If Loop inputFile.Close Set inputFile = Nothing Set fso = Nothing MsgBox "当前数据库设置已成功还原!", vbInformation End Sub
方案2:权限受限环境下的备选方案
如果遇到无法访问MSysOptions的场景(比如严格的权限控制),可以先列举MSDN文档里的已知选项,再通过遍历常见的选项名称来补充遗漏项。不过这个方案覆盖度不如方案1,仅作为备选:
- 先把MSDN列出的
GetOption参数全部存入数组 - 遍历数组导出值,再尝试一些常见的未文档化选项名称(比如
ShowNavigationPane、AllowFullMenus等)
关键注意事项
- 权限适配:部分环境下访问
MSysOptions需要将数据库加入信任位置,或使用管理员权限启动Access - 只读项处理:代码里已经标记了只读选项,导入时会自动跳过修改(因为
SetOption对只读项无效) - 版本兼容:动态查询
MSysOptions的方式会自动适配不同Access版本的新增配置,不用修改代码 - 编码规范:用UTF-8编码导出可以避免特殊字符乱码,确保SVN跟踪的文本文件编码一致
你可以把这个导出逻辑和已实现的对象、VBA引用导出整合在一起,生成一套完整的文本备份,完美适配SVN的版本跟踪需求。
内容的提问来源于stack exchange,提问作者Inarion
相关产品推荐
相关产品推荐

