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

发布于 2024-07-14 07:38:19 字数 359 浏览 6 评论 0原文

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

两个问题:

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

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

I have two Access 2003 databases (fooDb and barDb). There are four tables in fooDb that are linked to tables in barDb.

Two questions:

  • How do I update the table contents (linked tables in fooDb should be synchronized with the table contents in barDb)
  • How do I re-link the table to a different barDb using ADO.NET

I googled but didn't get any helpful results. What I found out is how to accomplish this in VB(6) and DAO, but I need a solution for C#.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

毁梦 2024-07-21 07:38:19

这是我使用 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 - 中央访问数据库的当前文件夹
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);
    }

Here is my solution to relinking DAO tables using C#.

My application uses a central MS Access database and 8 actual databases that are linked in.
The central database is stored locally to my C# app but the application allows for the 8 data databases to be located elsewhere. On startup, my C# app relinks DAO tables in the central database based on app.config settings.

Aside note, this database structure is the result of my app originally being a MS Access App which I ported to VB6. I am currently converting my app to C#. I could have moved off MS Access in VB6 or C# but it is a very easy to use desktop DB solution.

In the central database, I created a table called linkedtables with three columns TableName, LinkedTableName and DatabaseName.

On App start, I call this routine

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

Default.DRC_Data - Current folder of central access DB
Default.DRC_LinkedTables - Current folder of 8 data databases

Here is code does the actual relinking of the DAO Tables in 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();
        }


    }

Additional code written to fetch data from a access database and return it as a 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);
    }
悟红尘 2024-07-21 07:38:19

如果您使用 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 更新,而不是尝试逐行执行,后者效率会低得多。

If you're coding in C#, then Access is not involved, only Jet. So, you can use whatever method you want to access the data and then code the updates.

I've coded this kind of thing in Access many times, and my approach for each table is:

  1. run a query that deletes from fooDB that no longer exist in barDB.

  2. run a query that inserts into fooDB records that are in barDB that do not yet exist in fooDB.

  3. I always use code that writes on-the-fly SQL to update the fooDB table with the data from barDB.

The 3rd one is the hard one. I loop through the fields collection in DBA and write SQL on the fly that would be something like this:

UPDATE table2 INNER JOIN table1 ON table2.ID = table1.ID
SET table2.field1=table1.field1
WHERE (table2.field1 & "") <> (table1.field1 & "")

For numeric fields you'd have to use your available SQL dialect's function for converting Null to zero. Running Jet SQL, I'd use Nz(), of course, but that doesn't work via ODBC. Not sure if it will work with OLEDB, though.

In any event, the point is to issue a bunch of column-by-column SQL updates instead of trying to do it row by row, which will be much less efficient.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文