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
相关产品推荐
相关产品推荐

