4

我有两个 Access 2003 数据库(fooDbbarDb)。中有四个表fooDb链接到 中的表barDb

两个问题:

  • 如何更新表格内容(中的链接表格fooDb应与中的表格内容同步barDb
  • 如何将表重新链接到不同的barDb使用ADO.NET

我用谷歌搜索但没有得到任何有用的结果。我发现如何在 VB(6) 和 DAO 中实现这一点,但我需要 C# 的解决方案。

4

2 回答 2

6

这是我使用 C# 重新链接 DAO 表的解决方案。

我的应用程序使用一个中央 MS Access 数据库和 8 个链接的实际数据库。中央数据库本地存储到我的 C# 应用程序,但该应用程序允许 8 个数据数据库位于其他位置。启动时,我的 C# 应用程序根据 app.config 设置重新链接中央数据库中的 DAO 表。

顺便说一句,这个数据库结构是我的应用程序最初是我移植到 VB6 的 MS Access 应用程序的结果。我目前正在将我的应用程序转换为 C#。我本可以在 VB6 或 C# 中移除 MS Access,但它是一个非常易于使用的桌面数据库解决方案。

在中央数据库中,我创建了一个名为linkedtables 的表,其中包含三列TableName、LinkedTableName 和DatabaseName。

在 App 启动时,我调用此例程

            Common.RelinkDAOTables(Properties.Settings.Default.DRC_Data
                              , Properties.Settings.Default.DRC_LinkedTables
                              , "SELECT * FROM LinkedTables");

Default.DRC_Data - 中央访问数据库的当前文件夹 Default.DRC_LinkedTables - 8 个数据数据库的当前文件夹

这是在 C# 中实际重新链接 DAO 表的代码

        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();
        }


    }

为从访问数据库获取数据并将其作为 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);
    }
于 2010-12-06T16:10:38.897 回答
2

如果您使用 C# 进行编码,则不涉及 Access,仅涉及 Jet。因此,您可以使用任何您想访问数据的方法,然后编写更新代码。

我已经在 Access 中多次编写过这种东西,我对每个表的处理方法是:

  1. 运行从 fooDB 中删除的查询,该查询在 barDB 中不再存在。

  2. 运行一个查询,该查询插入到 barDB 中的 fooDB 记录中,但 fooDB 中尚不存在。

  3. 我总是使用编写动态 SQL 的代码来使用来自 barDB 的数据更新 fooDB 表。

第三个是硬的。我遍历 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 更新,而不是尝试逐行进行,这样效率会低得多。

于 2009-03-10T00:04:58.583 回答