相对来说删除关系更加容易,只要用
DAO.Database.Relations.Delete 关系名称
就可以了,代码如下:
--=========================================================== -- 过程及函数名: DelAllRelations -- 版本号 : -- -- 说明 : 本过程用于删除当前数据库中的所有关系 -- 引用 : Micrsoft DAO 3.6 Object Library -- 以上版本 -- 输入参数 : -- -- 输出值 : -- -- 返回值 : -- -- 调用演示 : DelAllRelations -- 在Access2003中按ALT+F11键转到VBE界面,菜单, -- 插入,模块,将本段代码复制进代码编辑界面, -- 将光标点击到Public Function处,按F5键运行, -- 在立即窗口可以看到打印结果。 -- 最后修改日期: 2010-1-27 19:45:00 -- 示例地址 : http:///?kbid;72FABF1E10DCEEF3 -- 作者 : cg1 -- 网站 : http:// -- 电子邮件 : access911@gmail.com -- 版权 : 作者保留一切权力, -- 请在公布本代码时将本段说明一起公布,谢谢! --=========================================================== Public Function DelAllRelations() Dim db As dao.Database Dim rel As dao.Relation Dim i As Long Set db = CurrentDb --列出所有的关系及关系的其他信息 For Each rel In db.Relations Debug.Print rel.Name --用DDL语句,通过删除索引来删除相关的关系。但是建立在QueryDef对象上的关系不能用以下语句删除 --strSql = "ALTER TABLE [" & rel.ForeignTable & "] DROP CONSTRAINT [" & rel.Name & "]" --Debug.Print strSql --CurrentProject.Connection.Execute strSql Next --注意不要在 For each 中用 db.Relations.Delete 来删除关系,因为涉及到一个枚举内容 --随删除的操作而变化的问题,不能一次删除干净 For i = db.Relations.Count - 1 To 0 Step -1 db.Relations.Delete db.Relations(i).Name Next End Function
--=========================================================== -- 过程及函数名: ListAllRelations -- 版本号 : -- -- 说明 : 本过程可以将所有“关系”信息打印到“立即窗口” -- 引用 : Micrsoft DAO 3.6 Object Library -- 以上版本 -- 输入参数 : -- -- 输出值 : -- -- 返回值 : -- -- 调用演示 : ListAllRelations -- 在Access2003中按ALT+F11键转到VBE界面,菜单, -- 插入,模块,将本段代码复制进代码编辑界面, -- 将光标点击到Public Function处,按F5键运行, -- 在立即窗口可以看到打印结果。 -- 最后修改日期: 2010-1-27 19:45:00 -- 示例地址 : http:///?kbid;72FABF1E10DCEEF3 -- 作者 : cg1 -- 网站 : http:// -- 电子邮件 : access911@gmail.com -- 版权 : 作者保留一切权力, -- 请在公布本代码时将本段说明一起公布,谢谢! --=========================================================== Public Function ListAllRelations() Dim tbl As dao.TableDef Dim db As dao.Database Dim pro As dao.Property Set db = CurrentDb Dim strSql As String Dim qry As dao.QueryDef Dim idx As dao.Index For Each tbl In db.TableDefs If tbl.Attributes = 0 Then For Each idx In tbl.Indexes --打印出所有的索引名称,可以和后面的关系名称对比一下 Debug.Print "index name ", idx.Name Next End If Next
Dim rel As dao.Relation --列出所有的关系及关系的其他信息 For Each rel In db.Relations Debug.Print rel.Name, rel.ForeignTable, rel.Table Debug.Print rel.Properties.Count Debug.Print rel.Attributes Debug.Print "Relation.Attributes :", dbRelationUnique, dbRelationDontEnforce, _ dbRelationInherited, dbRelationUpdateCascade, dbRelationDeleteCascade, _ dbRelationLeft, dbRelationRight -- 1 2 4 256 4096 16777216 33554432 db.Relations.Delete rel.Name For Each pro In rel.Properties Debug.Print pro.Name Next --strSql = "ALTER TABLE [" & rel.ForeignTable & "] DROP CONSTRAINT [" & rel.Name & "]" --Debug.Print strSql --CurrentProject.Connection.Execute strSql Next End Function
ADO方法: 另外,如果你知道表名比如 table4 中的 id 外键参照 table3 主的主键 id 字段, 则可以通过如下SQL语句得到constrant name SQL code select distinct szRelationship from MSysRelationships where szObject=--Table4-- and szReferencedObject=--Table3-- 然后也可以用DDL语句来进行删除。
|