Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> ADO/DAO/ADO.NET  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701874
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何用代码一次性列出或者删除所有“关系”

作者:cg1  摘自:access911.net  :cg1  更新日期:2010-1-27  浏览人次:

 

问题:

如何用代码一次性删除所有“关系”

MDB 又出现了奇怪的错误,按 ALT+F11就出现非法错误
图片如下:
按此在新窗口浏览图片

只能找到原来备份的文件,但是因为MDB中已经建立了关系,所以无法直接将新的数据导入,必须先删除关系,删除原有表,再导入才行。手动一个一个地删除关系太累了,如何用代码一次性删除所有的关系。

 

回答:


大家可能都看过我以前摘录的文章:
    关系如何用VBA程序来建立 
    http://www.access911.net/?kbid;75FAB41E10DC

相对来说删除关系更加容易,只要用 

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://access911.net/?kbid;72FABF1E10DCEEF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  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://access911.net/?kbid;72FABF1E10DCEEF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  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 codeselect distinct szRelationship
from MSysRelationships
where szObject='Table4'
and szReferencedObject='Table3'
然后也可以用DDL语句来进行删除。

 

本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     数据库中是否有必要建立“关系”
     如何用sql语句建立删除表关系?
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利