如何构建 OleDbCommand 查询,以便可以从一个 .MDB 中获取表,并将其替换到另一个 .MDB 中

2023-12-26

我正在尝试从一个 Access 数据库文件中获取表,将它们添加到另一个结构完全相同但信息不同的 Access 数据库文件中。我需要覆盖任何现有的表。我的项目快完成了,这是我最后的砖墙。

我使用名为 DatabaseHandling.cs 的单独类文件来处理 Access 数据库文件。

这是我当前的整个数据库处理.vscode。目前此内容保持最新。

Code:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;

namespace LCR_ShepherdStaffupdater_1._0
{
    public class DatabaseHandling
    {
        static DataTable datatableB = new DataTable();
        static DataTable datatableA = new DataTable();
        public static DataSet datasetA = new DataSet();
        public static DataSet datasetB = new DataSet();
        static OleDbDataAdapter adapterA = new OleDbDataAdapter();
        static OleDbDataAdapter adapterB = new OleDbDataAdapter();
        static string connectionstringA = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Settings.getfilelocationA();
        static string connectionstringB = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Settings.getfilelocationB();
        static OleDbConnection dataconnectionB = new OleDbConnection(connectionstringB);
        static OleDbConnection dataconnectionA = new OleDbConnection(connectionstringA);
        static DataTable tableListA;
        static DataTable tableListB;

        static public void addTableA(string table, bool addtoDataSet)
        {
            dataconnectionA.Open();
            datatableA = new DataTable(table);
            try
            {
                OleDbCommand commandselectA = new OleDbCommand("SELECT * FROM [" + table + "]", dataconnectionA);
                adapterA.SelectCommand = commandselectA;
                adapterA.Fill(datatableA);
            }
            catch
            {
                Logging.updateLog("Error: Tried to get " + table + " from DataSetA. Table doesn't exist!", true, false, false);
            }

            if (addtoDataSet == true)
            {
                datasetA.Tables.Add(datatableA);
                Logging.updateLog("Added DataTableA: " + datatableA.TableName.ToString() + " Successfully!", false, false, false);
            }

            dataconnectionA.Close();
        }

        static public void addTableB(string table, bool addtoDataSet)
        {
            dataconnectionB.Open();
            datatableB = new DataTable(table);

            try
            {
                OleDbCommand commandselectB = new OleDbCommand("SELECT * FROM [" + table + "]", dataconnectionB);
                adapterB.SelectCommand = commandselectB;
                adapterB.Fill(datatableB);
            }
            catch
            {
                Logging.updateLog("Error: Tried to get " + table + " from DataSetB. Table doesn't exist!", true, false, false);
            }



            if (addtoDataSet == true)
            {
                datasetB.Tables.Add(datatableB);
                Logging.updateLog("Added DataTableB: " + datatableB.TableName.ToString() + " Successfully!", false, false, false);
            }

            dataconnectionB.Close();
        }

        static public string[] getTablesA(string connectionString)
        {
            dataconnectionA.Open();
            tableListA = dataconnectionA.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
            string[] stringTableListA = new string[tableListA.Rows.Count];

            for (int i = 0; i < tableListA.Rows.Count; i++)
            {
                stringTableListA[i] = tableListA.Rows[i].ItemArray[2].ToString();
            }
            dataconnectionA.Close();
            return stringTableListA;
        }

        static public string[] getTablesB(string connectionString)
        {
            dataconnectionB.Open();
            tableListB = dataconnectionB.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
            string[] stringTableListB = new string[tableListB.Rows.Count];

            for (int i = 0; i < tableListB.Rows.Count; i++)
            {
                stringTableListB[i] = tableListB.Rows[i].ItemArray[2].ToString();
            }
            dataconnectionB.Close();
            return stringTableListB;
        }

        static public void createDataSet()
        {

            string[] tempA = getTablesA(connectionstringA);
            string[] tempB = getTablesB(connectionstringB);
            int percentage = 0;
            int maximum = (tempA.Length + tempB.Length);

            Logging.updateNotice("Loading Tables...");
            Logging.updateLog("Started Loading File A", false, true, false);
            for (int i = 0; i < tempA.Length ; i++)
            {
                if (!datasetA.Tables.Contains(tempA[i]))
                {
                    addTableA(tempA[i], true);
                    percentage++;
                    Logging.loadStatus(percentage, maximum);
                }
                else
                {
                    datasetA.Tables.Remove(tempA[i]);
                    addTableA(tempA[i], true);
                    percentage++;
                    Logging.loadStatus(percentage, maximum);
                }
            }
            Logging.updateLog("Finished loading File A", false, true, false);
            Logging.updateLog("Started loading File B", false, true, false);
            for (int i = 0; i < tempB.Length ; i++)
            {
                if (!datasetB.Tables.Contains(tempB[i]))
                {
                    addTableB(tempB[i], true);
                    percentage++;
                    Logging.loadStatus(percentage, maximum);
                }
                else
                {
                    datasetB.Tables.Remove(tempB[i]);
                    addTableB(tempB[i], true);
                    percentage++;
                    Logging.loadStatus(percentage, maximum);
                }
            }
            Logging.updateLog("Finished loading File B", false, true, false);


        }

        static public DataTable getDataTableA()
        {
            datatableA = datasetA.Tables[Settings.textA];

            return datatableA;
        }
        static public DataTable getDataTableB()
        {
            datatableB = datasetB.Tables[Settings.textB];
            return datatableB;
        }

        static public DataSet getDataSetA()
        {
            return datasetA;
        }

        static public DataSet getDataSetB()
        {
            return datasetB;
        }

        static public void InitiateCopyProcessA()
        {
            DataSet tablesA;
            tablesA = DatabaseHandling.getDataSetA();

                foreach (DataTable table in tablesA.Tables)
                {
                    OverwriteTable(table, table.TableName);
                    Logging.updateLog("Copied " + table.TableName + " successfully.", false, true, false);
                }

        }

        static void OverwriteTable(DataTable sourceTable, string tableName)
        {
            using (var destConn = new OleDbConnection(connectionstringA))
            using (var destCmd = new OleDbCommand(tableName, destConn) { CommandType = CommandType.TableDirect })
            using (var destDA = new OleDbDataAdapter(destCmd))
            {
                // Since we're using a single table, we can have the CommandBuilder
                // generate the appropriate INSERT and DELETE SQL statements
                using (var destCmdB = new OleDbCommandBuilder(destDA))
                {
                    destCmdB.QuotePrefix = "["; // quote reserved column names
                    destCmdB.QuotePrefix = "]";
                    destDA.DeleteCommand = destCmdB.GetDeleteCommand();
                    destDA.InsertCommand = destCmdB.GetInsertCommand();

                    // Get rows from destination, and delete them
                    var destTable = new DataTable();
                    destDA.Fill(destTable);
                    foreach (DataRow dr in destTable.Rows)
                    {
                        dr.Delete();
                    }
                    destDA.Update(destTable);

                    // Set rows from source as Added, so the DataAdapter will insert them
                    foreach (DataRow dr in sourceTable.Rows)
                    {
                        dr.SetAdded();
                    }
                    destDA.Update(sourceTable);
                }
            }
        }



        }          
    }

我只想获取内存中的数据表并将其写入 .MDB 文件。我已经尝试这样做了 30 多个小时。

最新编辑:

好的,添加了新代码。我收到一个新的运行时错误:FROM 子句中存在语法错误。

Code:

static public void InitiateCopyProcessA()
{
    DataSet tablesA;
    tablesA = DatabaseHandling.getDataSetA();

        foreach (DataTable table in tablesA.Tables)
        {
            OverwriteTable(table, table.TableName);
            Logging.updateLog("Copied " + table.TableName + " successfully.", false, true, false);
        }

}

static void OverwriteTable(DataTable sourceTable, string tableName)
{
    using (var destConn = new OleDbConnection(connectionstringA))
    using (var destCmd = new OleDbCommand(tableName, destConn) { CommandType = CommandType.TableDirect })
    using (var destDA = new OleDbDataAdapter(destCmd))
    {
        // Since we're using a single table, we can have the CommandBuilder
        // generate the appropriate INSERT and DELETE SQL statements
        using (var destCmdB = new OleDbCommandBuilder(destDA))
        {
            destCmdB.QuotePrefix = "["; // quote reserved column names
            destCmdB.QuotePrefix = "]";
            destDA.DeleteCommand = destCmdB.GetDeleteCommand();
            destDA.InsertCommand = destCmdB.GetInsertCommand();

            // Get rows from destination, and delete them
            var destTable = new DataTable();
            destDA.Fill(destTable);
            foreach (DataRow dr in destTable.Rows)
            {
                dr.Delete();
            }
            destDA.Update(destTable);

            // Set rows from source as Added, so the DataAdapter will insert them
            foreach (DataRow dr in sourceTable.Rows)
            {
                dr.SetAdded();
            }
            destDA.Update(sourceTable); // !!! Run-time error: Syntax error in FROM clause. !!!
        }
    }
}

再一次,它不起作用。如果您需要更多信息,请告诉我。


尝试更换

using (var destCmdB = new OleDbCommandBuilder(destDA)) 
{            
    destDA.DeleteCommand = destCmdB.GetDeleteCommand();            
    destDA.InsertCommand = destCmdB.GetInsertCommand();        
}

with

destDA.InsertCommand = new OleDbCommand("INSERT INTO `AdminUsers` (`UserName`, `Password`) VALUES (?, ?)");
destDA.DeleteCommand = new OleDbCommand("DELETE FROM `AdminUsers` WHERE (`ID` = ?)");
destDA.UpdateCommand = new OldDbCommand("UPDATE `AdminUsers` SET `UserName` = ?, `Password` = ? WHERE (`ID` = ?)");

查询对您的表结构有效的地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何构建 OleDbCommand 查询,以便可以从一个 .MDB 中获取表,并将其替换到另一个 .MDB 中 的相关文章

随机推荐

  • 如何在 Laravel 查询中添加括号?

    我的查询 laravel 是这样的 customer Customer where full name iLIKE param keyword gt orWhere mobile iLIKE param keyword gt orWhere
  • 过滤掉 ANSI 转义序列 [重复]

    这个问题在这里已经有答案了 我有一个 python 脚本 它试图解释分别写入 stdout 和 stdin 以及从中读取的数据的踪迹 问题是这些数据充满了我不关心的 ANSI 转义 这些转义符是 JSON 编码的 因此它们看起来像 033
  • Google Guice 的隐藏功能 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 django-rest-framework 中过滤 ListAPIView

    我正在使用 ListAPIView 但无法过滤结果 我的代码是 class UserPostReadView generics ListAPIView serializer class PostSerializer model serial
  • 超出 HttpClient 缓冲区大小限制

    我正在使用我的客户端获取有关存储在 Swift 对象存储中的某个文件的一些信息 该文件可以通过 REST Api 访问 在 Swift 中 指向指定对象的 HEAD 方法和 url 返回其包含在 HTML 响应 无内容 标头中的元数据 哈希
  • 捕获 QML 错误消息

    我在用着Qt createQmlObject 创建一个QML来自文件的对象 如果文件损坏 QML 会输出如下所示的消息 Qt createQmlObject failed to create object qrc graphics inli
  • Streambuilder 未收到某些快照数据

    我只是测试一些来自 GPS 的流 我可以直接插入 GPS 流 但我想暂时将其分开 所以我可以将 StreamBuilder 与我自己创建的流一起使用 这一切似乎都有效 但 Streambuilder 似乎 错过 了某些快照 这让我感到困惑
  • 如何在屏幕顶部显示通知?

    我想用jQuery 通知插件 https github com mickeyren jquery notifications 但它总是将通知栏放在页面顶部 因此 如果页面很大 则必须向上滚动到顶部才能看到通知 是否可以让通知始终显示在浏览器
  • 适用于 AMQP 的良好 Python 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您能推荐使用什么Python库来访问AMQP RabbitMQ 吗 根据我的研究pika似乎是首选之一
  • 通过 Uri 滑动加载本地图像。

    我正在尝试使用 Glide 从本地存储加载图像 但没有成功 Glide with mContext load pictureUri Uri of the picture transform new CircleTransform into
  • 操作栏 — 带有文本和图像的子菜单项无法正常工作

    我正在开发小型 Android 应用程序 其中使用操作栏和一些菜单项 一个菜单项包含子菜单 现在我想做的是始终显示带有文本和图标的菜单项 我按以下方式定义菜单项 menu menu
  • 关于 IIS 中最大文件上传大小的建议

    我意识到这个问题的答案取决于所使用的特定服务器 但很好奇人们是否对 ASP NET Web 表单允许的最大文件大小限制有建议 在一家印刷公司工作 希望允许图形设计师上传 我知道他们会超出我给他们的任何限制 您需要让您的用户满意 如果他们需要
  • 如何解决错误 ORA-06413:连接未打开?

    我本地环境VS2012 使用 Oracle 10g XE Dim dbConn As New OleDbConnection Dim dbComm As OleDbCommand dbConn ConnectionString Provid
  • MSI 可以与 EF Code First 一起使用吗?

    我已经在这个问题上陷入了很长一段时间 没有运气能够独自推进它 我正在尝试使用 MSI 令牌从 Azure 应用服务连接到 EF CodeFirst 托管数据库 当我使用 ARM 部署应用服务时 我生成了一个输出 确保它创建了一个服务主体 p
  • 防止 PHP 等待 mail() 函数

    在我的 Web 应用程序中 当用户对其帐户进行更改时 我调用 php mail 函数向该用户发送电子邮件通知 实施此操作后 我发现帐户更改操作需要非常长的时间 gt 20 秒 才能完成 我怀疑这是因为 PHP 等待 mail 函数发送电子邮
  • 使用 Tensorflow 训练时修改张量的值

    当我使用 Tensorflow 训练模型时 我想修改张量的值 这个张量是我的模型中的张量之一 weight tf Variable np matrix 经过一些迭代后 值weight将自动更新 我的问题是 如何修改weight非自动地 我已
  • 对象行为不正确

    我正在使用 Livewires 和 pygame 游戏中为您提供额外生命的对象之一被误认为是小行星对象 当额外生命对象与玩家碰撞时 它返回 额外生命对象没有属性 handle caught 错误消息 所以我可以提供一些帮助吗 class E
  • 使用 cert-manager 和 Nginx ingress 进行 404 质询响应

    我想得到LetsEncrypt 证书管理器 https cert manager io docs installation kubernetes 运行通过this https hub helm sh charts jetstack cert
  • 如何在Mac OS X下用C设置文件的创建日期?

    Mac OS X 存储文件创建时间 我知道如何读取它stat from
  • 如何构建 OleDbCommand 查询,以便可以从一个 .MDB 中获取表,并将其替换到另一个 .MDB 中

    我正在尝试从一个 Access 数据库文件中获取表 将它们添加到另一个结构完全相同但信息不同的 Access 数据库文件中 我需要覆盖任何现有的表 我的项目快完成了 这是我最后的砖墙 我使用名为 DatabaseHandling cs 的单