使用 C# 以编程方式更新 MS Access 数据库中的链接表
题
我有两个 Access 2003 数据库(fooDb
和 barDb
)。里面有四张桌子 fooDb
链接到表中的 barDb
.
两个问题:
- 如何更新表内容(链接表在
fooDb
应与表中的内容同步barDb
) - 如何将表重新链接到不同的表
barDb
使用ADO.NET
我用谷歌搜索但没有得到任何有用的结果。我发现如何在 VB(6) 和 DAO 中完成此任务,但我需要 C# 的解决方案。
解决方案
如果您使用 C# 进行编码,则不涉及 Access,只涉及 Jet。因此,您可以使用任何您想要的方法来访问数据,然后对更新进行编码。
我已经在 Access 中多次编码了这种事情,我对每个表的方法是:
运行一个查询,从 fooDB 中删除 barDB 中不再存在的内容。
运行一个查询,将 barDB 中尚不存在的记录插入 fooDB 中。
我总是使用编写即时 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.config 设置重新链接中央数据库中的 DAO 表。
另外请注意,此数据库结构是我的应用程序最初是 MS Access 应用程序的结果,我将其移植到 VB6。我目前正在将我的应用程序转换为 C#。我本可以放弃 VB6 或 C# 中的 MS Access,但它是一个非常易于使用的桌面数据库解决方案。
在中央数据库中,我创建了一个名为 linkedtables 的表,其中包含三列 TableName、LinkedTableName 和 DatabaseName。
在应用程序启动时,我将此例程称为
Common.RelinkDAOTables(Properties.Settings.Default.DRC_Data
, Properties.Settings.Default.DRC_LinkedTables
, "SELECT * FROM LinkedTables");
default.drc_data-中央访问db 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();
}
}
编写用于从 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);
}