1

我有两个数据库,一个“主”源(本地保存)和一个“复制”数据库(要分发)。一旦分发(本地或跨网络),两者都无法看到彼此,因此我们无法在分发后跨数据库执行查询。在分发复制数据库之前,我需要从复制数据库中删除一些内容,因此我决定创建一个 VBA 脚本来生成用于分发的复制数据库。

表中有查找,所以我决定保存一个模板数据库(从主源复制,然后从其中剥离表),然后删除表并以适当的顺序重新创建它们。

我现在需要删除一些数据,我很挣扎。

DeviceTable:
AutoNumber(ID)
Text(DeviceName)
Integer(ClusterID)
Text(Distribution)

ClusterTable:
AutoNumber(ID)
Text(ClusterName)

VirtualSystemTable:
AutoNumber(ID)
Text(VirtualSystemName)
Integer(ClusterID)
Integer(DeviceID)

InterfaceTable:
AutoNumber(ID)
Integer(VirtualSystemID)
Integer(ClusterID)
Integer(DeviceID)
Text(Description)

对于未标记为分发的任何内容,我需要从 DeviceTable、ClusterTable、VirtualSystemTable 和 InterfaceTable 中删除条目:“Public”

通常我会这样做(在psudocode中):

arrDEV = SQL("SELECT ID, ClusterID FROM DeviceTable WHERE Distribution<>"Public"")

然后,对于每个响应,我会

arrVSYS = SQL("SELECT ID FROM VirtualSystemTable WHERE DeviceID=$arrDEV.ID OR ClusterID=$arrDEV.ClusterID")
SQL("DELETE FROM InterfaceTable WHERE DeviceID=$arrDEV.ID OR ClusterID=$arrDEV.ClusterID OR VirtualSystemID=$arrVSYS.ID")
SQL("DELETE FROM VirtualSystemTable WHERE DeviceID=$arrDEV.ID OR ClusterID=$arrDEV.ClusterID")
SQL("DELETE FROM ClusterTable WHERE ID=$arrDEV.ClusterID")

我的问题是我不知道如何跨数据库链接执行这些查询。我很有趣 ADODB。我通常用 PHP 编码,所以这对我来说有点困难!

4

1 回答 1

1

你有正确的想法,但 VBA 与 PHP 有很大不同。您不能在字符串中使用变量,首先退出字符串,连接变量,然后再次启动字符串。

您通常会使用名为 arrDev 或 arrVSys 的数组,而我们在 MS Access 中使用 DAO Recordset 或 ADO Recordset 对象。

更新答案以反映您提供的信息:

Dim db As DAO.Database
Dim sSQL as String
Dim arrDEV As DAO.Recordset, Dim arrVSYS as DAO.Recordset
Set db = OpenDatabase("C:\SomeDatabase.accdb")
sSQL = "SELECT ID, ClusterID FROM DeviceTable WHERE Distribution <> 'Public'"
Set arrDEV = db.Open(sSQL)
If Not (arrDEV.EOF and arrDEV.BOF) Then
    arrDEV.movefirst
    Do Until arrDEV.eof = True
        sSQL = "SELECT ID FROM VirtualSystemTable WHERE DeviceID = " & arrDEV("ID") & _
                " OR ClusterID = " & arrDEV("ClusterID")
        Set arrVSYS = CurrentDb.Open(sSQl)

        sSQL = "DELETE FROM InterfaceTable WHERE DeviceID = " & arrDEV("ID") & _
                " OR ClusterID = " & arrDEV("ClusterID") & " OR VirtualSystemID = " & arrVSYS("ID")
        CurrentDb.Execute sSQl, dbFailOnError

        sSQL = "DELETE FROM VirtualSystemTable WHERE DeviceID = " & arrDEV("ID") & " OR ClusterID = " & arrDEV("ClusterID")
        CurrentDb.Execute sSQl, dbFailOnError

        sSQL = "DELETE FROM ClusterTable WHERE ID = " & arrDEV("ClusterID")
        CurrentDb.Execute sSQl, dbFailOnError

        arrVSYS.Close
        arrDEV.MoveNext
    Loop
End If
'Cleanup
Set arrVSYS = Nothing
arrDEV.Close
Set arrDEV = Nothing
db.close
Set db = Nothing

该代码未经测试,可能有一些错误。我唯一没有计划的是在 arrVSYS 中拥有不止一条记录。如果该记录集将有多个记录,那么您将需要另一个循环。

如您所见,您不需要使用 ADO 来访问另一个 Access 数据库。但是,如果“外部”数据库不是 Access,那么可以,您需要使用 ADO。

于 2013-08-30T15:49:39.137 回答