【问题标题】:Combining two Microsoft Access Databases into one with a form to choose between them将两个 Microsoft Access 数据库合并为一个,并使用一种形式在它们之间进行选择
【发布时间】:2010-12-14 20:00:38
【问题描述】:

因此,我被指派处理两个相同的数据库,它们的制作非常糟糕。两者都分为前端/后端,但具有不同的数据。

是否可以将两个数据库合并为一个并创建一个表单以允许用户选择他们将与哪个“数据库”进行交互?

为了澄清,使用这些数据库的学校有一个秋季学期和春季学期的数据库。两者都包含完全相同的表单/查询/表格,但具体数据不同。例如也许一位老师在秋季教 3 节课,但在春季教 4 节课(尽管数据库比这要复杂得多)。数据结构保持不变,但具体数据因数据库而异。

所以,如果他们需要访问数据,就需要打开相应的数据库。结果,他们不断地打开/关闭不同的数据库。他们想要做的是能够只使用一个数据库并在秋季/春季之间切换。

这有可能吗?

【问题讨论】:

    标签: database ms-access


    【解决方案1】:

    在不知道数据的确切结构的情况下,很难给出具体的答案,但我的直觉是这两个数据库绝对可以合并。合并同名表中的所有数据,但将“学期”列添加到任何会导致重复数据的表中。然后只需创建应用程序前端,以便用户在需要时选择他们想要查看的学期,并将其传递给检索数据的查询。正如您所指出的,您甚至可以从一开始就携带“学期”值,并将其从一个屏幕传递到另一个屏幕(使用全局应用程序级变量)。

    在我的职业生涯中,我不得不在 Access 中编写代码已经有一段时间了,但我确信有一种方法可以实现您的目标。也许发布更多关于您的特定数据结构的详细信息,我们都可以跳入并指点!

    【讨论】:

    • 我相信你是绝对正确的,我已经想到了这一点。正如你所说,我可以在数据库表中添加一个“学期”列,并用“秋季”标记秋季学期,用“春季”标记春季学期。然后我可以基本上合并表格并更新我所有的查询/表格/等以添加感兴趣的学期价值。但是,我需要手动更改数百个查询和表单才能执行此操作。我希望有一个解决方法。
    • “可以合并”应该是“强烈要求合并”
    • 咬紧牙关。做这项工作。对于喜欢节省时间的用户来说,事情会变得更加高效。
    【解决方案2】:

    这是我多年来多次使用的表格链接功能。为了使用它,您必须提供几个函数:

    1. ThisTableShouldBeChanged 被传递一个表的名称,如果表的链接应作为数据库切换的一部分重新链接,则返回 true。这将允许您有选择地从切换中排除表。
    2. GetConnectionString 应该返回新连接字符串的名称。构造到另一个 Access 数据库的连接字符串很简单,只需将完整的数据库路径放入以下格式:“;DATABASE=path”

    为了做你想做的事,你只需要在用户选择一个新的数据库打开时运行这个函数。一句忠告:我会在 UI 中放置一个明确无误的元素,或者例如屏幕的背景颜色,这将向用户发出他们正在处理哪个数据库的信号,这样就不会有混淆。

    在部署到生产环境时,此函数还可用于将表链接到 ODBC 或 SQL Server 连接。这就是我通常使用它的目的。

    Public Function LinkTables() As Boolean
    On Error GoTo HandleError
    
        Dim tdf As TableDef
        Dim tdfNew As TableDef
        Dim strName As String
        Dim tdfs As TableDefs
        Dim strSource As String
        Dim strConnect As String
    
        Dim blnThrowErr As Boolean
    
        Dim arr() As Variant
    
        Set tdfs = CurrentDb.TableDefs
    
        Dim intCount As Integer
        Dim i As Integer
    
        intCount = tdfs.Count
    
        strConnect = GetConnectionString()
    
        i = 1
    
        'Save a copy of the existing table names'
        ReDim arr(tdfs.Count, 2)
        For Each tdf In tdfs
            strName = tdf.Name
    
            If ThisTableShouldBeChanged(strName) Then
                If tdf.Connect <> "" Then
    
                    strSource = tdf.SourceTableName
    
                    arr(i, 1) = strName
                    arr(i, 2) = strSource
                    i = i + 1
                End If
            End If
        Next tdf
    
        tdfs.Refresh
    
        Dim strNameRep As String
    
        'Create new linked tables'
        For i = 1 To UBound(arr)
    
            If arr(i, 1) <> "" Then
    
                Set tdfNew = New TableDef
    
                strName = arr(i, 1)
    
                tdfNew.Name = arr(i, 1)
                tdfNew.SourceTableName = arr(i, 2)
                tdfNew.Connect = strConnect
    
                strNameRep = strName & "_temp"
    
                'rename the old table'
                tdfs(strName).Name = strNameRep
    
                tdfs.Refresh
    
                tdfs.Append tdfNew
    
                If Err.Number <> 0 Then
    
                    Debug.Print Err.Description
                     tdfs(strNameRep).Name = strName
    
                    Err.Clear
                Else
                    tdfs.Delete strNameRep
                End If
    
                On Error GoTo HandleError
    
            End If
        Next i
    
        tdfs.Refresh
        LinkTables = True
    
    ExitHere:
        Exit Function
    HandleError:
        MsgBox Err.Description & " (" & Err.Number & ")"
    
        LinkTables = False
        Resume ExitHere
    End Function
    

    【讨论】:

      【解决方案3】:

      我认为应该可以使用原始表名为每个表创建查询,并用一两个额外的字母命名新的组合表。假设您有一个学生表,新表变为 JointStudents 并且您创建查询学生:

      SELECT F1, F2, F3 FROM JointStudents WHERE Semester=Forms!PickSem!txtSemester
      

      这意味着任何引用学生表的表单或查询现在都将使用内置过滤器选择查询学生。

      【讨论】:

        【解决方案4】:

        一个最低初始成本的解决方案,设置一个界面以链接到适当的学期,仍然涉及触摸所有表单并添加另一个(用于“活动”数据库的用户友好控制),并且您' 仍然会为以后需要的任何更改产生额外费用(因为它们将在两个地方而不是一个地方进行)。

        您不必手动更改表:您可以编写 SQL 来完成。可以编写一个逐步遍历现有表并添加“学期”列并填充它的过程……最好在两个数据库中运行它,以便您也可以在同一过程中填充列。如果两个数据库中的表名称相同,甚至可以运行一个过程来逐步遍历所有表,更新 Fall、更新 Spring 并将 Spring 附加到 Fall,以便您将所有内容都放在一个数据库中。

        一种更安全的方法可能是将 Fall 结构复制到一个新表并修改该表,以防万一发生某些事情并且您需要“回滚”您所做的事情。

        鉴于这个问题是几个月前提出的,并且您正在与一所学校合作,您可能已经以某种方式解决了这个问题,或者不得不将它放在一边,但如果仍然需要它,我可以发布 VBA这应该会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-08
          • 1970-01-01
          • 1970-01-01
          • 2015-12-21
          • 2021-02-23
          • 2014-05-23
          相关资源
          最近更新 更多