我目前正在开发一个项目,该项目有许多没有关系的表。我想知道是否有可能首先创建表,然后创建关系,例如通过C#langauage或外部ms访问(甚至可能吗?)
我了解正常化。然而,由于我没有设法在谷歌上找到答案,我想问这个问题,我开始规范化过程,然后发现关系已经通过另一种方法完成了。
谢谢
答案 0 :(得分: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