以编程方式使用C#更新MS Access数据库中的链接表

时间:2009-03-09 08:18:03

标签: c# .net ms-access ado.net dao

我有两个Access 2003数据库(fooDbbarDb)。 fooDb中有四个表与barDb中的表相关联。

两个问题:

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

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

2 个答案:

答案 0 :(得分:5)

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

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

除此之外,这个数据库结构是我的应用程序最初是一个MS Access App的结果,我将其移植到VB6。我目前正在将我的应用转换为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);
    }

答案 1 :(得分:2)

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

我在Access中多次编写了这种东西,我对每个表的方法是:

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

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

  3. 我总是使用编写即时SQL的代码来使用barDB中的数据更新fooDB表。

  4. 第三个是艰难的。我遍历DBA中的fields集合并动态编写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更新,而不是逐行尝试,这样效率会低得多。