从另一个Access数据库更新表?

时间:2013-06-04 12:59:56

标签: vba ms-access

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

local:c:\ mydatabase.accdb network:\ 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

3 个答案:

答案 0 :(得分:4)

以下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

答案 1 :(得分:0)

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

答案 2 :(得分: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
相关问题