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

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

两个问题:

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

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

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

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

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

  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更新,而不是逐行尝试,这样效率会低得多。

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

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

除此之外,这个数据库结构是我的应用程序最初是一个MS Access应用程序的结果,我移植到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); }