比较2个Access(mdb)文件

时间:2012-07-19 18:18:08

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

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

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

问题是:文件包含太多数据,需要50多分钟才能将它们加载到Oracle表中。

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

修改

以下是我们用于导入数据的代码(不是由我编写的):

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);
    }
}

1 个答案:

答案 0 :(得分:0)

  • 在访问
  • 中打开一个.mdb
  • 将其他数据库中的表附加到打开的表中(右键单击“表”窗格,选择“链接表”或执行programmatically
  • 在查询选项卡中,创建一个新查询以进行比较 - 应该与您在oracle中执行的操作类似。您可以切换到SQL视图并粘贴相同的代码。

如果速度很慢,请尝试将两个文件复制到同一个硬盘。但是如果你没有更新,你可能不会这么做。您还可以考虑以某种方式在只读模式下执行查询(MSA不会尝试锁定.mdb,在网络上速度较慢)。访问可能不像Oracle那样聪明,但是,它可以通过自己的数据格式和简单的连接来体现。它将打破进入甲骨文的大门。

修改

回复评论:

感谢@FastAl,但是我们无法“手动”操纵Access文件,用户将把它们复制到网站的目录中,这是我们与之交互的唯一方式它们是通过C#代码

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

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

确保从程序中正确关闭第3个MDB;否则你将无法用新的DB覆盖其他2个DB,它们将在使用中。

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