Программно обновляйте связанные таблицы в базе данных MS Access с помощью C #
Вопрос
У меня есть две базы данных Access 2003 (fooDb
и barDb
).В нем есть четыре таблицы fooDb
которые связаны с таблицами в barDb
.
Два вопроса:
- Как мне обновить содержимое таблицы (связанные таблицы в
fooDb
должно быть синхронизировано с содержимым таблицы вbarDb
) - Как мне повторно связать таблицу с другим
barDb
используяADO.NET
Я погуглил, но не получил никаких полезных результатов.Я выяснил, как это сделать в VB (6) и DAO, но мне нужно решение для C #.
Решение
Если вы пишете на C #, то Access не задействован, только Jet.Таким образом, вы можете использовать любой метод, который вы хотите получить для доступа к данным, а затем закодировать обновления.
Я много раз кодировал подобные вещи в Access, и мой подход к каждой таблице таков:
запустите запрос, который удаляет из fooDB те файлы, которые больше не существуют в barDB.
запустите запрос, который вставляет в fooDB записи, находящиеся в barDB, которые еще не существуют в fooDB.
Я всегда использую код, который записывает SQL "на лету", чтобы обновить таблицу fooDB данными из barDB.
3-й - самый сложный.Я перебираю коллекцию полей в DBA и пишу SQL "на лету", который был бы чем-то вроде этого:
UPDATE table2 INNER JOIN table1 ON table2.ID = table1.ID
SET table2.field1=table1.field1
WHERE (table2.field1 & "") <> (table1.field1 & "")
Для числовых полей вам придется использовать функцию вашего доступного диалекта SQL для преобразования Null в ноль.Запустив Jet SQL, я бы, конечно, использовал Nz(), но это не работает через ODBC.Однако не уверен, будет ли это работать с OLEDB.
В любом случае, смысл в том, чтобы выпустить кучу обновлений SQL по столбцам вместо того, чтобы пытаться делать это построчно, что будет гораздо менее эффективным.
Другие советы
Вот мое решение для повторного связывания таблиц DAO с помощью C #.
Мое приложение использует центральную базу данных MS Access и 8 реальных баз данных, которые связаны между собой.Центральная база данных хранится локально в моем приложении на C #, но приложение позволяет размещать 8 баз данных данных в другом месте.При запуске мое приложение C # повторно связывает таблицы DAO в центральной базе данных на основе настроек app.config.
Помимо примечания, эта структура базы данных является результатом того, что мое приложение изначально было приложением MS Access, которое я портировал на VB6.В настоящее время я конвертирую свое приложение на C #.Я мог бы перейти с MS Access на VB6 или C #, но это очень простое в использовании решение для настольных баз данных.
В центральной базе данных я создал таблицу под названием linkedtables с тремя столбцами TableName, LinkedTableName и DatabaseName.
При запуске приложения я вызываю эту процедуру
Common.RelinkDAOTables(Properties.Settings.Default.DRC_Data
, Properties.Settings.Default.DRC_LinkedTables
, "SELECT * FROM LinkedTables");
По умолчанию.DRC_Data - Текущая папка базы данных центрального доступа По умолчанию.DRC_LinkedTables - Текущая папка из 8 баз данных данных
Вот код, выполняющий фактическую перелинковку таблиц DAO на C#
public static void RelinkDAOTables(string MDBfile, string filepath, string sql)
{
DataTable linkedTables = TableFromMDB(MDBfile, sql);
dao.DBEngine DBE = new dao.DBEngine();
dao.Database DB = DBE.OpenDatabase(MDBfile, false, false, "");
foreach (DataRow row in linkedTables.Rows)
{
dao.TableDef table = DB.TableDefs[row["Name"].ToString()];
table.Connect = string.Format(";DATABASE={0}{1} ;TABLE={2}", filepath, row["database"], row["LinkedName"]);
table.RefreshLink();
}
}
Дополнительный код, написанный для извлечения данных из базы данных access и возврата их в виде DataTable
public static DataTable TableFromOleDB(string Connectstring, string Sql)
{
try
{
OleDbConnection conn = new OleDbConnection(Connectstring);
conn.Open();
OleDbCommand cmd = new OleDbCommand(Sql, conn);
OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
DataTable table = new DataTable();
adapter.Fill(table);
return table;
}
catch (OleDbException)
{
return null;
}
}
public static DataTable TableFromMDB(string MDBfile, string Sql)
{
return TableFromOleDB(string.Format(sConnectionString, MDBfile), Sql);
}