1

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

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

两个数据库都有 2 个相同的表,我们称它们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
4

3 回答 3

5

以下 C# 控制台应用程序适用于我。请注意,它使用 ODBC 并打开“publicdatabase.accdb”Exclusive=1;以确保没有其他人在使用它。我希望将相同的技术应用于 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
于 2013-06-04T13:38:46.180 回答
0

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

于 2013-06-04T14:10:29.127 回答
0

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
于 2014-08-22T13:55:48.270 回答