我有一个关于访问数据库A的表(存储更多60.000条记录),我必须将其导入到另一个Access数据库B上的表中。
开始时,Access数据库B上的表存储来自Access数据库A的表中的3000条记录。
访问数据库A由另一个程序处理,如果我不必对其进行更改,我最好能够打开它并获取数据。我需要从访问数据库A上的表中导入更新记录和新记录以访问数据库B.
每天数据库A都有100条新记录和一些更新记录,我需要在一天结束时将它们导入数据库B.我需要自动完成。
新记录很容易找到,但更新记录怎么样?使用更新记录,我需要在数据库B中添加新行,而不是更改数据库B中的任何行。
有没有更好的方法来执行此操作,可能使用ODBC连接或其他?
请帮帮我! 谢谢和最好的问候。
答案 0 :(得分:2)
Have a look at this microsoft web page
基本步骤是
答案 1 :(得分:0)
您的数据库B现在“链接”到数据库A中的数据。现在您可以使用“联合”查询或任何您喜欢的查询将其与存储在数据库B表中的数据相结合。最重要的是,这不需要对数据库A进行任何更改。
答案 2 :(得分:0)
要更新现有记录,您需要比较两个记录,并在目标数据库中它们不相同时进行更新。
根据所涉及的字段数量,这可能很复杂。
这是我过去用于此目的的代码:
Public Function UpdateTableData(ByVal strSourceTable As String, _
ByVal strTargetTable As String, ByVal strJoinField As String, _
ByRef db As DAO.Database, Optional ByVal strExcludeFieldsList As String, _
Optional strAdditionalCriteria As String) As Boolean
Dim strUpdate As String
Dim rsFields As DAO.Recordset
Dim fld As DAO.Field
Dim strFieldName As String
Dim strNZValue As String
Dim strSet As String
Dim strWhere As String
strUpdate = "UPDATE " & strTargetTable & " INNER JOIN " & strSourceTable & " ON " & strTargetTable & "." & strJoinField & " = " & strSourceTable & "." & strJoinField
' if the fields don't have the same names in both tables,
' create a query that aliases the fields to have the names of the
' target table
' if the source table is in a different database and you don't
' want to create a linked table, create a query and specify
' the external database as the source of the table
' alternatively, for strTargetTable, supply a SQL string with
' the external connect string
Set rsFields = db.OpenRecordset(strSourceTable)
For Each fld In rsFields.Fields
strFieldName = fld.Name
If strFieldName <> strJoinField Or (InStr(", " & strExcludeFieldsList & ",", strFieldName & ",") <> 0) Then
Select Case fld.Type
Case dbText, dbMemo
strNZValue = "''"
Case Else
strNZValue = "0"
End Select
strSet = " SET " & strTargetTable & "." & strFieldName & " = varZLSToNull(" & strSourceTable & "." & strFieldName & ")"
strSet = strSet & ", " & strTargetTable & ".Updated = #" & Date & "#"
strWhere = " WHERE Nz(" & strTargetTable & "." & strFieldName & ", " & strNZValue & ") <> Nz(" & strSourceTable & "." & strFieldName & ", " & strNZValue & ")"
If db.TableDefs(strTargetTable).Fields(fld.Name).Required Then
strWhere = strWhere & " AND " & strSourceTable & "." & strFieldName & " Is Not Null"
End If
If Len(strAdditionalCriteria) > 0 Then
strWhere = strWhere & " AND " & strAdditionalCriteria
End If
Debug.Print strUpdate & strSet & strWhere
Debug.Print SQLRun(strUpdate & strSet & strWhere, dbLocal) & " " & strFieldName & " updated."
End If
Next fld
rsFields.Close
Set rsFields = Nothing
UpdateTableData = True
End Function
您可以将此函数传递给两个表名或两个查询名。这允许很大的灵活性。它假定字段名称在传递的对象中都是相同的,如果它们不是同一个名称,您可以创建一个查询来对字段进行别名以匹配另一个表中的字段。
这是我用了数万次的代码变体。基本原则是它执行一系列UPDATE查询,这些查询在表中逐列进行,并根据哪些行具有不同的值进行更新。