Программно обновляйте связанные таблицы в базе данных MS Access с помощью C #

StackOverflow https://stackoverflow.com/questions/625360

Вопрос

У меня есть две базы данных Access 2003 (fooDb и barDb).В нем есть четыре таблицы fooDb которые связаны с таблицами в barDb.

Два вопроса:

  • Как мне обновить содержимое таблицы (связанные таблицы в fooDb должно быть синхронизировано с содержимым таблицы в barDb)
  • Как мне повторно связать таблицу с другим barDb используя ADO.NET

Я погуглил, но не получил никаких полезных результатов.Я выяснил, как это сделать в VB (6) и DAO, но мне нужно решение для C #.

Это было полезно?

Решение

Если вы пишете на C #, то Access не задействован, только Jet.Таким образом, вы можете использовать любой метод, который вы хотите получить для доступа к данным, а затем закодировать обновления.

Я много раз кодировал подобные вещи в Access, и мой подход к каждой таблице таков:

  1. запустите запрос, который удаляет из fooDB те файлы, которые больше не существуют в barDB.

  2. запустите запрос, который вставляет в fooDB записи, находящиеся в barDB, которые еще не существуют в fooDB.

  3. Я всегда использую код, который записывает 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);
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top