【问题标题】:Comparing 2 Access(mdb) files比较 2 个 Access(mdb) 文件
【发布时间】:2012-07-19 18:18:07
【问题描述】:

我们正在处理这个项目,有时我们需要验证来自 2 个不同 Access(mdb) 文件的数据。此验证包括根据“主键”列比较这两个文件的条目,以验证其他列的值是否从文件更改为另一个。

我的同事编写了一些代码,将这两个文件中的数据导入到 Oracle 表中,并在视图中使用 sql 连接进行验证。

问题是:文件数据太多,加载到 Oracle 表需要 50 多分钟。

有没有更好的方法来制作这个例程?无需将所有数据导入数据库?

编辑

这是我们用来导入数据的代码(不是我写的):

protected void InsereDadosTemp()
{
    try
    {
        String vMesAno = ReportParameter.ReportData.Parameters.Item("pMesAnoCompetencia").Value;

        Hashtable hashMesAno = new Hashtable();
        hashMesAno.Add(vMesAno, 1);
        hashMesAno.Add(MesAnterior(vMesAno), 2);

        OleDbConnection objConnOracle = new OleDbConnection(ConfigurationManager.ConnectionStrings["Main"].ToString());
        objConnOracle.Open();

        OleDbCommand objCmdPciReport = new OleDbCommand("DELETE FROM ZBRICAGEM", objConnOracle);
        objCmdPciReport.ExecuteNonQuery();

        foreach (DictionaryEntry obj in hashMesAno)
        {
            string vConnectionString = MontaConnectionString(obj.Key.ToString());

            OleDbConnection objConnAccess = new OleDbConnection(vConnectionString);

            objConnAccess.Open();

            OleDbCommand objCmdAccess = new OleDbCommand("SELECT * FROM TEST where EQUIPE NOT IN  ('ONCO', 'DERMA', 'AROMA', 'SOMA', 'IDADE', 'HORMONIO')", objConnAccess);
            OleDbDataReader reader = objCmdAccess.ExecuteReader();
            if (reader.HasRows)
            {
                objCmdPciReport = new OleDbCommand("INSERT INTO ZBRICAGEM (ID_BRICK, BRICK, SETOR, EQUIPE, NOME_POOL, BRICKS_UF, BU, ARQUIVO ) Values (" +
                                                              "BRICKS_SEQ.NEXTVAL, :p1, :p2, :p3, :p4, :p5, :p6, :p7)", objConnOracle);
                objCmdPciReport.CommandType = CommandType.Text;


                while (reader.Read())
                {
                    objCmdPciReport.Parameters.Clear();
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p1", OleDbType.VarChar, 100)).Value = reader["BRICK"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p2", OleDbType.VarChar, 100)).Value = reader["SETOR"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p3", OleDbType.VarChar, 100)).Value = reader["EQUIPE"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p4", OleDbType.VarChar, 100)).Value = reader["NOME_POOL"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p5", OleDbType.VarChar, 100)).Value = reader["BRICKS_UF"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p6", OleDbType.VarChar, 100)).Value = reader["BU"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p7", OleDbType.VarChar, 100)).Value = Path.GetFileName(objConnAccess.ConnectionString);

                    objCmdPciReport.ExecuteNonQuery();
                }
            }

            objConnAccess.Close();
        }

        objConnOracle.Close();
    }
    catch (Exception ex)
    {
        throw new Exception("Erro durante a importação de Bricagem: " + ex.Message);
    }
}

【问题讨论】:

  • 问题是这个验证是向客户显示的报告的一部分。所以,他选择了他要比较的文件,然后我们将文件的数据插入数据库中,比较它们并呈现文件之间的差异。该文件将由用户复制到一个目录中,程序将读取它们。因此,很遗憾,我们无法处理 Access 文件中的查询。
  • 这里的一些注释:stackoverflow.com/questions/4648565/tablediff-example/… 我在某个阶段编写了一些代码,用于将所有表与相关主键进行比较。
  • 如何将访问数据加载到 oracle 中?也许对该过程进行一些性能调整会有所帮助。
  • 我已经添加了我们用来导入数据的代码。

标签: c# asp.net oracle ms-access


【解决方案1】:
  • 在access中打开一个.mdb
  • 将另一个数据库中的表附加到打开的数据库中(右键单击“表”窗格,选择“链接表”或执行此操作programmatically
  • 在查询选项卡中,创建一个新查询来进行比较 - 应该类似于您在 oracle 中所做的。您或许可以切换到 SQL 视图并粘贴相同的代码。

如果速度很慢,请尝试将两个文件复制到同一个硬盘驱动器。但是,如果您不更新,则可能不必这样做。您还可以考虑以某种方式以只读模式执行查询(MSA 不会尝试锁定 .mdb,网络速度较慢)。 Access 可能不如 Oracle 智能,但是,它具有自己的数据格式和简单的连接将是不错的。这将打破导入到 oracle 的大门。

编辑

回复评论:

感谢@FastAl,但我们不能“手动”操作 Access 文件,它们将被用户复制到网站的目录中,我们是唯一的交互方式它们是通过 C# 代码实现的

仍然可以利用这种方法。查询链接表将是速度的关键。

  • 标准化您将复制的 2 个访问 DB 的路径/文件名。要么直接将它们写为来自网络上传代码的这些名称,要么如果用户通过网络共享复制,只需告诉他们正确命名即可。
  • 制作第三个 .mdb,以附加到您放置在标准化名称/位置中的数据库副本中的表格。
  • 在你的c#程序中打开它;见http://www.connectionstrings.com/access-2007http://www.connectionstrings.com/access
  • 从 c# 运行查询(您也可以通过 MSAccess 在第三个 .mdb 中获得它,只需将查询作为表名打开)。

确保从程序中正确关闭第三个 MDB;否则你将无法用新的数据库覆盖另外 2 个数据库,它们将被使用。

也可以在 c# 访问中以编程方式链接表 - 我很久以前就这样做了,但忘记了如何。您还可以将它们链接到 oracle/SQL;不过,这可能需要执行 process.execute /.Waitforexit 并仅在这些 dbms 中运行脚本来处理它。黑客入侵。我看不到他们的“访问链接”驱动程序比访问更快;充其量他们可能只是使用“喷气发动机”dll(猜测)。

【讨论】:

  • 感谢@FastAl,但我们不能“手动”操作 Access 文件,它们将被用户复制到网站的目录中,我们是唯一的方法通过 C# 代码与它们交互。
猜你喜欢
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2019-05-24
相关资源
最近更新 更多