【问题标题】:Updating table in one Access database from another?从另一个 Access 数据库中更新表?
【发布时间】:2014-08-22 21:55:48
【问题描述】:

我的本​​地 PC 上有一个 Access 2007 数据库,网络上有另一个数据库。

本地:c:\mydatabase.accdb 网络:\server\share\publicdatabase.accdb

两个数据库都有两个相同的表,我们称它们为Table1Table2

我的过程涉及将数据从 PICK 数据库导出到分隔的文本文件,然后将其导入 Access。

目前,我更新本地数据库中的表,然后在 Access 中将表从本地数据库复制/粘贴到网络数据库。我希望通过 VBA 做到这一点。

我发现以下代码将用于网络数据库清除表然后“拉”更新,但我需要从我的电脑运行它以清除网络数据库表然后“推送”更新.

Dim AccessConn As New   System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test Files\database.mdb")

AccessConn.Open()
Dim AccessCommand As New System.Data.OleDb.OleDbCommand("DELETE * FROM [Catlog]",  AccessConn)
AccessCommand.ExecuteNonQuery()
AccessCommand.CommandText = "INSERT INTO [Table1] SELECT * FROM [MS  Access;DATABASE=C:\Test Files\database.mdb;].[Table1]"
AccessCommand.ExecuteNonQuery()
AccessConn.Close() 

另外,如果不是太麻烦,我怎么能包括检查以首先确保网络数据库可以更新? (尚未被其他用户打开)

谢谢!!

编辑:到目前为止有效:

With Access.DoCmd
    .RunSQL "Delete FROM Table1 IN '\\server\share\publicdatabase.accdb'"
    .RunSQL "Insert INTO Table1 IN '\\server\share\publicdatabase.accdb' SELECT * FROM Table1"
End With

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    以下 C# 控制台应用程序适用于我。请注意,它使用 ODBC 并使用Exclusive=1; 打开“publicdatabase.accdb”,以确保没有其他人在使用它。我希望将相同的技术应用于 VBA 解决方案不会太困难。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.Odbc;
    
    namespace odbcTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var con = new OdbcConnection(
                            "Driver={Microsoft Access Driver (*.mdb, *.accdb)};" +
                            @"Dbq=C:\__tmp\publicdatabase.accdb;" +
                            "Exclusive=1;" +
                            "Uid=admin;" +
                            "Pwd=;"))
                {
                    try
                    {
                        con.Open();
                    }
                    catch
                    {
                        Console.WriteLine("Exclusive 'Open' failed. Quitting.");
                        System.Threading.Thread.Sleep(2000);
                        return;
                    }
                    using (var cmd = new OdbcCommand())
                    {
                        cmd.Connection = con;
                        cmd.CommandText = "DELETE FROM Table1";
                        cmd.ExecuteNonQuery();
                        cmd.CommandText = @"INSERT INTO Table1 SELECT * FROM [MS Access;DATABASE=C:\__tmp\mydatabase.accdb;].[Table1]";
                        cmd.ExecuteNonQuery();
                    }
                    con.Close();
                }
                Console.WriteLine("Done.");
                System.Threading.Thread.Sleep(2000);
            }
        }
    }
    

    编辑

    相应的 VBA 代码是这样的。它旨在从本地数据库 (mydatabase.accdb) 运行,并使用Application.CurrentDb.Name 来避免对本地数据库路径进行硬编码(以防“mydatabase.accdb”被移动到另一个位置):

    Sub UpdatePublicDatabase()
    Dim con As Object
    Set con = CreateObject("ADODB.Connection")
    On Error GoTo UpdatePublicDatabase_OpenError
    con.Open _
            "Driver={Microsoft Access Driver (*.mdb, *.accdb)};" & _
            "Dbq=C:\__tmp\publicdatabase.accdb;" & _
            "Exclusive=1;" & _
            "Uid=admin;" & _
            "Pwd=;"
    On Error GoTo 0
    con.Execute "DELETE FROM Table1"
    con.Execute "INSERT INTO Table1 SELECT * FROM [MS Access;DATABASE=" & Application.CurrentDb.Name & ";].[Table1]"
    con.Close
    Debug.Print "Done."
    Exit Sub
    
    UpdatePublicDatabase_OpenError:
    Debug.Print "Exclusive 'Open' failed. Quitting."
    Exit Sub
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      您的解决方案似乎是合理的。我们仍处于工作的黑暗时代(A2003),所以我对此不确定; A2007中没有锁定文件吗?如果是这样,您可以打开它并确保没有条目(与您用于导入该 PICK 文件的过程相同),如果清楚,那么您可以运行您的导入/导出过程。

      【讨论】:

        【解决方案3】:

        Gord Thompson 给出了一个很好的答案,帮助我实现了我的用例。我不得不将 SOURCEDB.tableXX 行复制到 DESTDB.tableXX。并非每次运行此函数时都应复制所有表数据。

        我创建了一个新的 ACTIONSDB.accdb msaccess 文件,其中插入了一个新的 vba Module1。这可能也应该在 Excel vba 模块中工作。这是简化版本,没有我的特殊情况 when_not_to_copy_based_on_month_and_day 规则。

        Option Compare Database
        Option Explicit
        
        Sub importDataFromDB()
        ' Copy table rows from source MSAccess db to another db
        On Error GoTo ErrorLabel
            Dim idx As Long
            Dim tables As Collection
            Dim sTable As String
            Dim sql As String
            Dim con As Object
        
            Set tables = New Collection
            Call tables.Add("tbl_data1")
            Call tables.Add("tbl_data2")
            Call tables.Add("tbl_data5")
            ' ...more tablenames
        
            Set con = CreateObject("ADODB.Connection")
            con.ConnectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};" & _
                    "Dbq=C:\data\DESTDB.accdb;" & _
                    "Exclusive=1;" & _
                    "Uid=;" & _
                    "Pwd=;"
            con.Open
            Debug.Print ""
            Debug.Print "Tables (" & tables.Count & ")"
            For idx = 1 To tables.Count
                sTable = tables.Item(idx)
                Debug.Print sTable & " (" & idx & "/" & tables.Count & ")"
                sql = "INSERT INTO ${table} SELECT * FROM [MS Access;DATABASE=C:\data\SOURCEDB.accdb;].[${table}]"
                sql = Replace(sql, "${table}", sTable, 1, -1, vbTextCompare)
                con.Execute "DELETE FROM " & sTable
                con.Execute sql
            Next idx
            con.Close
            Debug.Print "Completed"
        
        ExitLabel:
            Exit Sub
        
        ErrorLabel:
            Debug.Print Err.Description
            con.Close
            Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
        End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-07
          • 2018-06-17
          • 2023-03-22
          • 1970-01-01
          • 2016-09-14
          • 2011-03-09
          • 2013-02-23
          相关资源
          最近更新 更多