Обновление таблицы в одной базе данных Access из другой?

Вопрос: У меня есть база данных Access 2007 на моем локальном ПК, а другая - в сети. local: c:mydatabase.accdb network:serversharepublicdatabase.accdb Обе базы данных имеют 2 идентичные таблицы, позвольте назвать их Table1 и Table2 Мой процесс включает в себя экспорт данных из базы данных PICK в текстовый файл с разделителями, а затем импорт его в Access.

Вопрос:

У меня есть база данных Access 2007 на моем локальном ПК, а другая – в сети.

local: c:mydatabase.accdb network:serversharepublicdatabase.accdb

Обе базы данных имеют 2 идентичные таблицы, позвольте назвать их Table1 и Table2

Мой процесс включает в себя экспорт данных из базы данных PICK в текстовый файл с разделителями, а затем импорт его в Access.

В настоящее время я обновляю таблицы в своем локальном db, а затем в Access я копирую/вставляю таблицу из моего локального db в сетевую db. Я надеюсь это сделать через VBA.

Я нашел следующий код, который будет использоваться в сетевом db, чтобы очистить таблицу, а затем “вытащить” обновление, но мне нужно запустить его с моего компьютера, чтобы очистить таблицу db сети, а затем “нажать” обновление.

Dim AccessConn As New System.Data.OleDb.OleDbConnection(«Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:Test Filesdatabase.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 Filesdatabase.mdb;].[Table1]» AccessCommand.ExecuteNonQuery() AccessConn.Close()

Кроме того, если это не так уж сложно, как я могу включить проверку, чтобы сначала убедиться, что сетевое db доступно для обновления? (еще не открытый другим пользователем)

Спасибо!!

EDIT: это работает до сих пор:

With Access.DoCmd .RunSQL «Delete FROM Table1 IN ‘\serversharepublicdatabase.accdb'» .RunSQL «Insert INTO Table1 IN ‘\serversharepublicdatabase.accdb’ SELECT * FROM Table1» End With Лучший ответ:

Для меня работает следующее консольное приложение С#. Обратите внимание, что он использует 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:__tmppublicdatabase.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:__tmpmydatabase.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:__tmppublicdatabase.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

Ваше решение кажется звуковым. Мы все еще в темном возрасте на работе (A2003), поэтому я не уверен в этом; нет ли файла блокировки в A2007? Если это так, вы можете открыть его и убедиться, что нет записей (тот же процесс, который вы используете для импорта этого файла PICK), и если он очищается, вы можете запустить процесс импорта/экспорта.

Ответ №2

Горд Томпсон дал отличный ответ, который помог мне реализовать мой прецедент. Мне пришлось копировать строки SOURCEDB.tableXX в DESTDB.tableXX. Не все таблицы данных должны копироваться каждый раз при выполнении этой функции.

Я создал новый файл msACcess ACTIONSDB.accdb, в который был вставлен новый 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:dataDESTDB.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:dataSOURCEDB.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

Оцените статью
Добавить комментарий