1

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

我的同事编写了一些代码将这两个文件中的数据导入到 Oracle 表中,并使用视图中的 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);
    }
}
4

1 回答 1

0
  • 在访问中打开一个.mdb
  • 将另一个数据库中的表附加到打开的表(右键单击“表”窗格,选择“链接表”或以编程方式执行)
  • 在查询选项卡中,进行新查询以进行比较 - 应该类似于您在 oracle 中所做的。您也许可以切换到 SQL 视图并粘贴相同的代码。

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

编辑

回复评论:

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

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

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

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

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

于 2012-07-19T18:42:21.210 回答