1

ローカル PC に Access 2007 データベースがあり、ネットワーク上に別のデータベースがあります。

ローカル: c:\mydatabase.accdb ネットワーク: \server\share\publicdatabase.accdb

両方のデータベースには2つの同一のテーブルがあります。それらを呼び出してTable1Table2

私のプロセスでは、データを PICK データベースから区切りテキスト ファイルにエクスポートしてから、Access にインポートします。

現在、ローカル データベースのテーブルを更新してから、Access でテーブルをローカル データベースからネットワーク データベースにコピー/貼り付けします。これをVBAで実現したいと考えています。

ネットワークデータベースでテーブルをクリアしてから更新を「プル」するために使用される次のコードを見つけましたが、PCから実行してネットワークデータベーステーブルをクリアしてから更新を「プッシュ」する必要があります。

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 に答える