【问题标题】:database tables created in access and relationships to be created somewhere else?在访问和关系中创建的数据库表要在其他地方创建?
【发布时间】:2017-12-11 15:03:03
【问题描述】:

我目前正在处理一个项目,该项目有许多没有关系的表。我想知道是否可以先创建表,然后再创建关系,例如通过 C# 语言或外部 ms 访问(这甚至可能吗?)

我有标准化的知识。然而,由于我没有设法在谷歌上找到答案,我想问这个问题,以防我开始规范化过程,然后发现关系已经通过另一种方法完成。

谢谢

【问题讨论】:

  • 我的意思是理论上只要数据完整性得到维护,所以没有外键错误,我看不出有什么理由你不能这样做
  • 所以你可以用正确的键创建表,然后从另一个程序中建立关系? @SaggingRufus 你能给我一个例子或链接吗
  • 有多种方法可以从 C# 实现显式关系,例如使用 DDL 查询(如 SaggingRufus 共享的链接),或使用 COM 和 DAO。如果你问一个具体的问题,我可以给出一个具体的答案。它们都不要求您的字段名称在两个表上都相同(afaik)
  • 你不清楚。您的意思是您想知道如何确定表是否满足 FK 约束,还是什么?

标签: sql database ms-access relationship database-normalization


【解决方案1】:

我会按照 Erik 的建议使用 DAO。虽然我没有从 C# 运行它的代码,但这里的 VBA 示例应该演示所需的步骤:

' Creates and appends missing relations between the local tables.
' Note, that this will create a hidden index on the foreign table field.
' Returns True if success, False if not.
'
' 2017-11-14. Gustav Brock. Cactus Data ApS, CPH.
'
Public Function CreateLocalDataTableRelations() As Boolean

    Dim Database        As DAO.Database
    Dim Field           As DAO.Field
    Dim Relation        As DAO.Relation
    Dim Table           As DAO.TableDef
    Dim ForeignTable    As DAO.TableDef

    Dim RelationName    As String
    Dim Result          As Boolean

    Set Database = CurrentDb

    Set Table = Database.TableDefs("Country")
    Set ForeignTable = Database.TableDefs("Zone")
    RelationName = Table.Name & "_" & ForeignTable.Name
    If Not IsTableRelation(RelationName) Then
        ' Create and append relation RelationName.
            Set Relation = Database.CreateRelation(RelationName)
            Relation.Table = Table.Name
            Relation.ForeignTable = ForeignTable.Name
            Relation.Attributes = dbRelationUpdateCascade
                Set Field = Relation.CreateField("Code")
                Field.ForeignName = "CountryCode"
            Relation.Fields.Append Field
        Database.Relations.Append Relation
    End If

    Set Table = Database.TableDefs("Zone")
    Set ForeignTable = Database.TableDefs("Timezone")
    RelationName = Table.Name & "_" & ForeignTable.Name
    If Not IsTableRelation(RelationName) Then
        ' Create and append relation RelationName.
            Set Relation = Database.CreateRelation(RelationName)
            Relation.Table = Table.Name
            Relation.ForeignTable = ForeignTable.Name
            Relation.Attributes = dbRelationUpdateCascade
                Set Field = Relation.CreateField("ZoneId")
                Field.ForeignName = "ZoneId"
            Relation.Fields.Append Field
        Database.Relations.Append Relation
    End If

    Result = (Err.Number = ErrorNone)

    CreateLocalDataTableRelations = Result

End Function

和辅助函数:

' Checks if a relation named RelationName exists.
' Returns True if it is found, False if not.
'
' 2017-11-14. Gustav Brock. Cactus Data ApS, CPH.
'
Public Function IsTableRelation( _
    ByVal RelationName As String) _
    As Boolean

    Dim Relation    As DAO.Relation

    Dim Result      As Boolean

    For Each Relation In CurrentDb.Relations
        If Relation.Name = RelationName Then
            Exit For
        End If
    Next
    Result = Not (Relation Is Nothing)

    IsTableRelation = Result

End Function

【讨论】:

  • IsTableRelation 是 UDF 吗?如果是这样,您能否提供它,或者提供有关它的作用的见解?我不熟悉那个功能。
  • @ErikvonAsmuth:是的,错过了,抱歉。这是一个简单的辅助函数。我已经添加了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多