You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access数据库关系修复:删除关系报错与XML导入属性转换问题

问题解答

一、要不要先删光所有现有关系?

不用全删,只删你要修复的那部分就行。全删纯属给自己找麻烦,万一误删正常关系,恢复起来更费时间。要是备份够完整,真要全删也不是不行,但优先针对性删除更稳妥。

二、解决MSysAccessStorage锁定报错

你那函数会遍历所有关系,包括系统表的,但MSysAccessStorage是Access的系统表,默认会被锁定保护。改下函数,跳过系统关系就行:

Function DropRelationships()
    With CurrentDb
        For Each rel In .Relations
            ' 跳过以MSys开头的系统关系
            If Left(rel.Name, 4) <> "MSys" Then
                .Relations.Delete Name:=rel.Name
            End If
        Next
    End With
End Function

另外再检查这几点:

  • 把所有打开的窗体、报表都关了,只留VBA编辑器和数据库窗口
  • 任务管理器里把Access相关进程全结束,重新开数据库
  • 别在共享文件夹操作,复制到本地再弄

三、数字转关系常量名可行吗?

完全可行!Access里的关系属性数字就是对应常量的十进制总和,比如dbRelationUpdateCascade是256,dbRelationDeleteCascade是4096,加起来刚好是4352,和你XML里的数字对上。

你找到的论坛代码可以用,核心就是把数字和常量做对应。给你个简单的转换函数参考:

Function GetRelationAttrName(ByVal attrNum As Long) As String
    Dim attrNames As String
    attrNames = ""
    ' 检查是否包含更新级联
    If (attrNum And dbRelationUpdateCascade) = dbRelationUpdateCascade Then
        attrNames = attrNames & "dbRelationUpdateCascade + "
    End If
    ' 检查是否包含删除级联
    If (attrNum And dbRelationDeleteCascade) = dbRelationDeleteCascade Then
        attrNames = attrNames & "dbRelationDeleteCascade + "
    End If
    ' 还可以加其他需要的常量,比如dbRelationDontEnforce
    If Len(attrNames) > 0 Then
        ' 去掉最后多余的"+ "
        GetRelationAttrName = Left(attrNames, Len(attrNames) - 3)
    Else
        GetRelationAttrName = "0"
    End If
End Function

调用的时候传XML里的数字,直接就能得到你要的字符串。

内容的提问来源于stack exchange,提问作者JohnM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:10:12